2012-12-30 86 views
1

我想在更多的表格(4+)之間做一個複雜的SELECT操作,它會對訂單和物品進行計數。非常複雜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.con tact_id)子句

但是,當我添加下一個子句並使查詢更大以按標籤發佈的總評論排序時,意外出現。

有人能找到正確的方法嗎?

我會根據您的需求評論和修改/澄清問題。

感謝, 有一個快樂的新年,我發現是,你需要一個WHERE子句,如果你想限制的行

+0

等一下,請更清楚你添加的內容不起作用。您試圖添加更多'ORDER BY'?請張貼這些表的表結構(至少相關的列,如果它們很長的話) –

回答

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表中沒有重複項,則根本不需要外部聚合。

+0

我認爲你的查詢澄清了我想要的。但是,我在「字段列表」中獲得了「1054 - 未知列'myc_c'」 –

+0

你知道哪裏可以從哪裏來? –

+0

發現它,它是sum(myc_c),應該添加count(*)作爲cnt1並且做sum(myc_c.cnt1):)我將調整它直到我得到它工作,它顯示比我更好的東西,仍然不完善....你能告訴我你爲什麼使用SUM嗎? –

0

至少一個問題。 JOIN應該只包含JOIN的considtions。

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,看看你是否能得到你所期待的。

+0

在'on'子句中過濾連接的錶行是沒有問題的。 – danihp

+0

@danihp,但它有點不舒服你不覺得嗎?如果限制在正確的位置,查詢更具可讀性並且更易於調試。 –

+0

但在左連接是不一樣的!您的句子僅在內部連接中有效。 – danihp