按最常见的类别选择订单(Mysql,Php)

时间:2015-10-14 12:25:26

标签: php mysql sql

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

首先: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..

第二个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个结果)。我想要具有最常见类别的文章。有人有想法吗?

2 个答案:

答案 0 :(得分:0)

使用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%条件,它将从选择中排除。

答案 1 :(得分:0)

您必须为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

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