非常复杂的SELECT

时间:2012-12-30 18:09:38

标签: mysql

我想在更多表(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)条款

但是当我添加下一个子句并使查询更大,按照标签发布的总评论来排序时,会出现意外情况。

有人能以正确的方式指出我吗?

我会根据您的需要评论和调整/澄清问题。

感谢, 祝新年快乐

2 个答案:

答案 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,看看你是否得到了你期望的结果。

相关问题