我想做一个复杂的选择,在更多的表(4+)之间,将排序和计数项目。
到目前为止,我的台词是:
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_用户(一组唱片标签)
myc_contact s(一个用户有多少个收藏夹,contact_type='l'表示它是关于myl_用户的,而不是其他表)
myl_发行版包含音乐发行版(如EP、专辑,带有唯一id
myl_r_comments包含普通用户对这些版本的评论。
我设法按唱片公司有多少最喜欢的唱片(15、14、10、8…)——COUNT(myc_c.contact_id)条款来订购
但是,当我添加下一个子句并使查询按标签发布的注释总数排序时,会出现意外情况。
有人能帮我指出正确的方向吗?
我将根据您的需要对问题进行评论和修改/澄清。
谢谢,
新年快乐
最佳答案
问题是你是沿着多维求和,所以你得到的是一个叉积。最好的方法是独立地沿着每个维度进行总结:
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_表中没有重复项,则根本不需要外部聚合。关于mysql - 非常复杂的SELECT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14093213/