mysql - 带有where子句的子查询mysql

标签 mysql subquery

Hello, Im stuck with mysql subquery, this is the table I have

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 上的数量,但是当我尝试它时子查询返回多行。 这是我的查询

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

最佳答案

您不需要子查询来获取 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

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

关于mysql - 带有where子句的子查询mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619914/

相关文章:

mysql - LEFT JOIN MySQL 语句中的 CONCAT

php - 这是什么错误? "Database query failed: Data truncated for column ' column_name' 在第 1 行

java - 结果集来自更新。没有数据

mysql - 如何在主选择和连接中访问子查询

php - 如何计算从当前系统日期到过去和 future 日期的 365 天,并使用 php 和 mysql 相应地获取数据

mysql - 这个查询有什么问题吗?它返回一个结果两次,我不明白为什么

python - 动态访问 pandas 数据框的子集,执行计算并写入新数据框

mysql - 在内部查询中使用外部查询中的结果

SQL joining,从子查询求和计算总聚合量

swift - Realm - 如何获取父子关系中实体所有者的列表?