按最常见的类别排序(Mysql, Php)


Select order by the most common categories (Mysql, Php)

我的mysql数据库中有两个表:

First: articles:

 Id |    page_title   | description 
-------------------------------------
  1 | Bob Dylan       | Lorem Ipsum..
  2 | Paul Mccartney  | Lorem Ipsum..
  3 | John Lennon     | Lorem Ipsum..
  4 | Pierce Brosnan  | Lorem Ipsum..
  5 | Microsoft       | Lorem Ipsum..
  6 | Apple           | Lorem Ipsum..
  7 | Google          | Lorem Ipsum..
  8 | Steve Jobs      | Lorem Ipsum..
  9 | Neil Young      | Lorem Ipsum..

Second categories:

 Id |     page_id     | category_name
-------------------------------------
  1 | 1               | musician
  2 | 2               | beatles_member
  3 | 3               | beatles_member
  4 | 5               | company
  5 | 6               | company
  6 | 7               | company
  7 | 8               | entrepreneur
  8 | 9               | guitarist
  9 | 2               | pianist
 10 | 4               | actor
 11 | 4               | jamesbond_actor
 12 | 8               | apple_ceo
 13 | 2               | musician

现在我有一篇文章,例如Paul McCartneyId 2。他的分类是(musician, pianist, beatles_member)。在这个例子中更多的是3导致页面大小

现在我想从articles表中获得其他5篇具有最常见类别的文章。在这个例子中,上面的3

我尝试在mysql中这样做:

$categories = "'musician', 'pianist', 'beatles_member'";

SELECT * FROM articles a LEFT JOIN categories c ON c.page_id = a.Id WHERE c.category_name IN ($categories) LIMIT 5

但是有了这个,我就得到了Paul McCartney拥有的所有类别的文章(通常不超过3个结果)。我想要有最常见类别的文章。有人知道吗?

使用GROUP BY &HAVING:

SELECT p.*
FROM pages p
LEFT JOIN categoires c ON c.page_id = p.id
WHERE c.category_name IN (%categories%)
GROUP BY p.page_id
HAVING COUNT(c.id) = %number_of_categories%

粘贴你的类别列表而不是%categories%和类别数量而不是%number_of_categories%

结果,您将得到一个包含所有指定类别的页面列表。如果某个页面没有%categories%列表中的至少一个类别,那么由于COUNT(c.id) = %number_of_categories%条件,它将被排除在选择之外。

必须对in

中包含的最常见类别进行子查询。
SELECT * FROM articles a LEFT JOIN categories c ON c.page_id = a.Id WHERE c.category_name IN (SELECT category_name FROM categorie [...]  LIMIT 3 ) LIMIT 5

我不想替你做所有的工作。