MySQL相关';项目';查询 请考虑以下项目表:
非常感谢您的帮助MySQL相关';项目';查询 请考虑以下项目表:,mysql,sql,Mysql,Sql,非常感谢您的帮助 皮特我正在用平板电脑,所以我会简短地说。将它们视为三个独立的查询,并将它们合并。当我有了键盘后,我会带着sql回来。谢谢你的提示,Marlin,在阅读和一些实验之后,我想我可能已经破解了它 SELECT p.*, ( IFNULL(themes.matches, 0) + IFNULL(platforms.matches, 0) + IFNULL(clients.matches, 0) ) as score FROM `project`
皮特我正在用平板电脑,所以我会简短地说。将它们视为三个独立的查询,并将它们合并。当我有了键盘后,我会带着sql回来。谢谢你的提示,Marlin,在阅读和一些实验之后,我想我可能已经破解了它
SELECT
p.*,
(
IFNULL(themes.matches, 0) + IFNULL(platforms.matches, 0) + IFNULL(clients.matches, 0)
) as score
FROM `project` p
LEFT JOIN (
SELECT t2.project_id, COUNT(*) as matches FROM `project_theme` t1, `project_theme` t2
WHERE
t1.theme_id = t2.theme_id AND t1.project_id = 1
GROUP BY t2.project_id
) themes ON p.id = themes.project_id
LEFT JOIN (
SELECT f2.project_id, COUNT(*) as matches FROM `project_platform` f1, `project_platform` f2
WHERE
f1.platform_id = f2.platform_id AND f1.project_id = 1
GROUP BY f2.project_id
) platforms ON p.id = platforms.project_id
LEFT JOIN (
SELECT p2.id, COUNT(*) as matches FROM `project` p1, `project` p2
WHERE
p1.client_id = p2.client_id AND p1.id = 1
GROUP BY p2.id
) clients ON p.id = clients.id
GROUP BY p.`id`
HAVING score > 0
ORDER BY score DESC;
Project A:
Themes: 18, 19
Platforms: 1, 4
Client: 22
Project D:
Themes: 18, 19
Platforms: 1, 4
Client: 22
Score: 5
Project G:
Themes: 18, 21
Platforms: 3, 4
Client: 22
Score: 3
Project B:
Themes: 8, 21
Platforms: 2, 4
Client: 1
Score: 1
SELECT
`project`.*,
GROUP_CONCAT(`project_theme`.`theme_id`) as themes,
GROUP_CONCAT(`project_platform`.`platform_id`) as platforms,
`project`.`client_id` as client
FROM `project`
LEFT JOIN `project_theme` ON `project`.`id` = `project_theme`.`project_id`
LEFT JOIN `project_platform` ON `project`.`id` = `project_platform`.`project_id`
GROUP BY `project`.`id`
SELECT
p.*,
(
IFNULL(themes.matches, 0) + IFNULL(platforms.matches, 0) + IFNULL(clients.matches, 0)
) as score
FROM `project` p
LEFT JOIN (
SELECT t2.project_id, COUNT(*) as matches FROM `project_theme` t1, `project_theme` t2
WHERE
t1.theme_id = t2.theme_id AND t1.project_id = 1
GROUP BY t2.project_id
) themes ON p.id = themes.project_id
LEFT JOIN (
SELECT f2.project_id, COUNT(*) as matches FROM `project_platform` f1, `project_platform` f2
WHERE
f1.platform_id = f2.platform_id AND f1.project_id = 1
GROUP BY f2.project_id
) platforms ON p.id = platforms.project_id
LEFT JOIN (
SELECT p2.id, COUNT(*) as matches FROM `project` p1, `project` p2
WHERE
p1.client_id = p2.client_id AND p1.id = 1
GROUP BY p2.id
) clients ON p.id = clients.id
GROUP BY p.`id`
HAVING score > 0
ORDER BY score DESC;