我的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 McCartney
与Id 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
我不想替你做所有的工作。