我的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 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个结果)。我想要具有最常见类别的文章。有人有想法吗?
答案 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
我不想做你所做的所有工作。