我想在更多表(4+)之间进行复杂的SELECT,这些表将对项目进行排序和计数。
到目前为止,这就是我的观点:
SELECT
myl_u.id,
myl_u.label_real_address,
myl_u.ext,
COUNT(myc_c.contact_id),
COUNT(myl_r_c.release_id)
FROM
myl_users myl_u
LEFT JOIN myc_contacts myc_c ON myc_c.contact_type='l' AND myc_c.contact_id=myl_u.id
LEFT JOIN myl_releases myl_r ON myl_r.id=myl_u.id
LEFT JOIN myl_r_comments myl_r_c ON myl_r.release_id=myl_r_c.release_id
GROUP BY myl_u.label_real_address
ORDER BY COUNT(myc_c.contact_id) DESC
它已经完成了一半,但是当我添加SQL的后半部分时,它会显示意外的值,并且它会以某种方式使它们加倍。
基本上我有 myl_users (记录标签的集合) myc_contacts (用户拥有多少收藏夹,contact_type =' l'表示它与myl_users有关,而不是其他表) myl_releases 包含音乐发布(例如EP,相册,具有唯一身份识别码) 和myl_r_comments 包含常规用户对这些版本的评论。
我成功订购了唱片公司有多少收藏品(15,14,10,8 ......) - COUNT(myc_c.contact_id)条款
但是当我添加下一个子句并使查询更大,按照标签发布的总评论来排序时,会出现意外情况。
有人能以正确的方式指出我吗?
我会根据您的需要评论和调整/澄清问题。
感谢, 祝新年快乐
答案 0 :(得分:1)
问题是你在多个方面进行求和,因此你得到了一个交叉产品。最好的方法是独立地总结每个维度:
SELECT myl_u.id, myl_u.label_real_address, myl_u.ext,
sum(myc_c.cnt),
sum(myl_rc.cnt)
FROM myl_users myl_u LEFT JOIN
(select contact_id, count(*) as cnt
from myc_contacts myc_c
where myc_c.contact_type='l'
group by contact_id
) myc_c
ON myc_c.contact_id=myl_u.id LEFT JOIN
(select myl_r.id, count(*) as cnt
from myl_releases myl_r LEFT JOIN
myl_r_comments myl_r_c
ON myl_r.release_id=myl_r_c.release_id
gropu by myl_r.id
) myl_rc
ON myl_rc.id=myl_u.id
GROUP BY myl_u.id, myl_u.label_real_address, myl_u.ext
ORDER BY 4 DESC
从问题中不清楚最终group by
是否必要。如果myl_u表中没有重复项,那么根本不需要外部聚合。
答案 1 :(得分:0)
我发现至少有一个问题是,如果要限制行,则需要WHERE子句。 JOIN应仅包括JOIN的注释。
SELECT
myl_u.id,
myl_u.label_real_address,
myl_u.ext,
COUNT(myc_c.contact_id),
COUNT(myl_r_c.release_id)
FROM
myl_users myl_u
LEFT JOIN myc_contacts myc_c ON myc_c.contact_id=myl_u.id
LEFT JOIN myl_releases myl_r ON myl_r.id=myl_u.id
LEFT JOIN myl_r_comments myl_r_c ON myl_r.release_id=myl_r_c.release_id
WHERE
myc_c.contact_types = '1'
GROUP BY myl_u.label_real_address
ORDER BY COUNT(myc_c.contact_id) DESC
另外,你确定它是你想要的左连接吗?即使右侧没有匹配的值,也会返回“左”表中的所有行。尝试将LEFT更改为INNER,看看你是否得到了你期望的结果。