2

抱歉标题不好,但我什至不知道如何解释......

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

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

为了简单。一个产品可以与零个、一个或多个 tyd 相关。

什么叫 TYD 是 tyds 表中的四行。一个 tyd 由它的 ref_tyd 标识。

例如,product_2 与 tyds N° 98 && 99 相关。

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

我想得到的是所有的产品信息,如果它们与 tyds 相关,还有它附带的 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 表。但是一击就不会更好吗?

非常感谢您的帮助四!

4

2 回答 2

2

好的。

要解决第一个问题(合并两个 product_2 记录),只需更改

GROUP BY id_product

GROUP BY id_product, ref_tyd

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

于 2013-11-05T13:32:56.137 回答
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

编辑 此外,我已将 < 5 更改为 <= 5,这似乎是您想要的。

于 2013-11-05T13:32:22.867 回答