按最常见的类别(Mysql、Php)选择顺序
我的Mysql数据库中有两个表: 第一篇:按最常见的类别(Mysql、Php)选择顺序,php,mysql,sql,Php,Mysql,Sql,我的Mysql数据库中有两个表: 第一篇:文章: Id | page_title | description ------------------------------------- 1 | Bob Dylan | Lorem Ipsum.. 2 | Paul Mccartney | Lorem Ipsum.. 3 | John Lennon | Lorem Ipsum.. 4 | Pierce Brosnan | Lorem Ipsum.
文章
:
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..
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
第二类类别
:
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..
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
现在我有一篇文章,例如paulmccartney
,带有id2
。
他的类别是(音乐家、钢琴家、披头士成员)
。
在这个例子中,更多的原因是页面大小
现在我想从articles
表中获得5篇其他文章,它们具有最常见的类别。在这个例子中,上面的3
我尝试用mysql做到这一点是:
$categories = "'musician', 'pianist', 'beatles_member'";
SELECT*FROM articles a LEFT JOIN categories c ON c.page\u id=a.id其中c.categories\u name IN($categories)限制5
但是有了这些,我就得到了包含保罗·麦卡特尼(Paul McCartney)所有类别的文章(通常不超过3个结果)。我想要的文章有最常见的类别。有人有想法吗?使用
分组方式和拥有的简单解决方案:
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\u of_categories%
因此,您将得到一个包含所有指定类别的页面列表。如果某个页面在%categories%
列表中至少没有一个类别,那么它将被排除在选择之外,因为计数(c.id)=%number\u of_categories%
条件。使用GROUP BY
&的简单解决方案:
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\u of_categories%
因此,您将得到一个包含所有指定类别的页面列表。如果某个页面在%categories%
列表中至少没有一个类别,那么它将被排除在选择之外,因为计数(c.id)=%number\u of_categories%
条件。您必须对表中包含的最常见类别进行子查询
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
我不想替你做所有的工作。你必须对表中最常见的类别进行子查询
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
我不想在你的位置上做所有的工作。请定义最常见的。下面的查询将为您提供最常见的类别<代码>从类别分组中按类别名称选择类别名称、计数(*)
或者您是否正在寻找一种方法,根据您提供的输入类别对每个类别进行排序?有点像marketbasket分析。请定义最常见的。下面的查询将为您提供最常见的类别<代码>从类别分组中按类别名称选择类别名称、计数(*)
或者您是否正在寻找一种方法,根据您提供的输入类别对每个类别进行排序?有点像marketbasket分析。注意左连接c。。。其中c与内部连接c相同。
请注意,左连接c。。。其中c与内部连接c相同。