我想做一个复杂的选择,在更多的表(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/

10-09 00:50