1

我想在更多表(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、专辑,具有唯一 ID 和 myl_r_comments包含普通用户对这些版本的评论。

我设法按唱片公司有多少收藏夹(15、14、10、8..)来排序 - COUNT(myc_c.contact_id) 子句

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

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

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

谢谢,新年快乐

4

2 回答 2

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 表中没有重复项,则根本不需要外部聚合。

于 2012-12-30T18:19:48.187 回答
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,看看是否得到了预期的结果。

于 2012-12-30T18:15:02.417 回答