【问题标题】:Subquery mysql with where clause带有where子句的子查询mysql
【发布时间】:2017-10-07 12:03:59
【问题描述】:

你好,我坚持使用 mysql 子查询,这是我的表

table detail_order
==============================
id_detail | id_order | id_toko
1         | 1        | 1
2         | 1        | 2
3         | 1        | 3
4         | 1        | 4

table ket_detail
==================================
id_ket | id_detail | id_size | qty
1      | 1         | 7       | 3
2      | 1         | 9       | 1
3      | 1         | 5       | 2
4      | 2         | 7       | 8

table size
=================================
id_size | size | id_color | stock
7       | 40   | 6        | 30
9       | 42   | 6        | 20
5       | 39   | 5        | 30

table color
==========================
id_color | color
6        | green
5        | red

我尝试在子查询中使用 where 子句在表 ket_detail 上显示 qty,但是当我尝试它时,子查询返回不止一行。 这是我的查询

SELECT dt.id_detail, 
       SUM(tk.qty) AS tot_order, 
       COUNT(dm.color) AS tot_color,
      (SELECT ket.qty FROM ket_detail AS ket, t_size AS u 
       WHERE u.id_size=ket.id_size AND u.size = 40) AS size_40
FROM detail_order AS dt 
LEFT JOIN ket_detail AS tk ON tk.id_detail=dt.id_detail
LEFT JOIN t_size AS u ON u.id_size = tk.id_size
LEFT JOIN t_color AS dm ON dm.id_color=u.id_color
WHERE dt.id_order = 1
GROUP BY dt.id_detail

但是当我将大小更改为 39 时,这样的数据

id_detail | tot_order | tot_color | size_40
============================================
1         | 6         | 2         | 2
2         | 8         | 1         | 2
3         | NULL      | 0         | 2
4         | NULL      | 0         | 2

我想要的是这样的数据

id_detail | tot_order | tot_color | size_40
============================================
1         | 6         | 2         | 3
2         | 8         | 1         | 8
3         | NULL      | 0         | NULL
4         | NULL      | 0         | NULL

【问题讨论】:

  • 您需要在子查询中使用JOIN 来生成id_size 匹配的结果,粗略地查看您的问题。
  • 尺寸需要id吗?为什么?
  • 在提供的示例数据中,表ket_detail 中没有jumlah_order 字段。查询使用了这个字段。
  • 根据您的数据显示的结果是“正确的”,因为来自sizesize = 39qty 为“2”。我认为你需要更清楚地解释你想要做什么,因为它有点混乱。此外,jumlah_order 不在您提供的表格数据中。
  • 您仍然不需要代理键。您的主键可以分别是 (id_detail)、(id_detail,id_size)、(size,id_color) 和 (id_color) - 尽管我也质疑是否需要 color_id。

标签: mysql subquery


【解决方案1】:

您不需要子查询来获取 size = 39size = 40 数据。您可以改用条件聚合

SELECT dt.id_detail, 
       SUM(tk.qty) AS tot_order, 
       COUNT(dm.color) AS tot_color,
       SUM(CASE 
              WHEN u.size = 39 THEN tk.qty
              ELSE 0
           END)  AS size_39,       
       SUM(CASE 
              WHEN u.size = 40 THEN tk.qty
              ELSE 0
           END)  AS size_40        
FROM detail_order AS dt 
LEFT JOIN ket_detail AS tk ON tk.id_detail=dt.id_detail
LEFT JOIN t_size AS u ON u.id_size = tk.id_size
LEFT JOIN t_color AS dm ON dm.id_color=u.id_color
WHERE dt.id_order = 1
GROUP BY dt.id_detail;

Demo here

使用子查询的正确方法是:

SELECT dt.id_detail, 
       SUM(tk.qty) AS tot_order, 
       COUNT(dm.color) AS tot_color,
      (SELECT SUM(ket.qty) 
       FROM ket_detail AS ket
       JOIN t_size AS u ON u.id_size=ket.id_size
       WHERE ket.id_detail = dt.id_detail AND u.size = 40) AS size_40
FROM detail_order AS dt 
LEFT JOIN ket_detail AS tk ON tk.id_detail=dt.id_detail
LEFT JOIN t_size AS u ON u.id_size = tk.id_size
LEFT JOIN t_color AS dm ON dm.id_color=u.id_color
WHERE dt.id_order = 1
GROUP BY dt.id_detail;

Demo here

如果您需要为多个尺寸选择总数量,则必须为每个所需尺寸重复子查询。因此,我认为,第一个查询提供了一个更简洁、更易于扩展和更高效的解决方案。

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-05-19
    相关资源
    最近更新 更多