SQL连接非常复杂,但有小提琴

时间:2013-11-05 13:24:00

标签: mysql sql join outer-join

抱歉这个糟糕的头衔,但我甚至不知道如何解释...

这是小提琴:http://sqlfiddle.com/#!2/f21e3/5

所以我得到了一个非常基本的产品表和我的数据表(在这种情况下是tyds)。

简单化。产品可以与ZERO,ONE OR MORE tyd相关。

TYD在tyds表中是四行的调用。 一个tyd由它的ref_tyd标识。

对于该示例,product_2与tyds N°98&& 99。

其他产品(尚未)与tyds表相关。

我想得到的是所有产品信息,如果它们与tyd相关,则提供随附的tyds信息。

所以,在我的小提琴中,这是我期待的结果:

ID_PRODUCT  NAME            REF_TYD         CNT_USER    ACTION_TYD
1           product_1       NONE            0           NONE
2           product_2       98              1           5
2           product_2       99              1           1
3           product_3       NONE            0           NONE

有什么变化:

现在我得到与id_product = 2相关的两个TYDS(98& 99)。

所以现在CNT_USER行在两行中都返回1和1而不是两个不同的东西。

对于tyd N°98,期望的action_tyd为5

对于tyd N°99,期望的action_tyd为1

所以发生的事情是SQL只获取他找到的第一个tyd关系,然后转到下一个product_id。逻辑但不是我想要的东西:)

当然,我可以先进行查询以获取所有产品,然后针对每种产品检查tyds表。但是一次拍不会更好吗?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

行。

要修复第一个问题(合并两个product_2记录的位置),只需更改

即可
GROUP BY id_product

GROUP BY id_product, ref_tyd

。第二个错误也很容易修复 - 你说CASE WHEN action_tyd > 0 AND action_tyd < 5 THEN action_tyd END,所以当然不包括5的action_tyd!只需将其更改为&lt; = 5。

答案 1 :(得分:1)

这为您提供了预期的结果(注意添加的GROUP BY列):

SELECT 
    products.id_product AS id_product, 
    products.name_product AS name, 
    COALESCE(tyds.ref_tyd, "NONE") AS ref_tyd, 
    SUM(CASE WHEN action_tyd = 11 THEN 1 ELSE 0 END) AS cnt_user, 
    COALESCE(MAX(CASE WHEN action_tyd > 0 AND action_tyd <= 5 THEN action_tyd END), "NONE") AS action_tyd 
    FROM products
    LEFT JOIN tyds ON tyds.product_tyd = products.id_product
    GROUP BY id_product, ref_tyd

修改 此外,我已经改变了&lt; 5到&lt; = 5,这似乎是你想要的。