Mysql连接两个表并根据主键计算总记录
Posted
技术标签:
【中文标题】Mysql连接两个表并根据主键计算总记录【英文标题】:Mysql joining two tables and counting total records based on primary key 【发布时间】:2017-10-14 03:35:23 【问题描述】:我在 mysql 数据库上有两个表 vendor
和 medicines
现在我需要计算基于供应商 ID 交易的药品总数,条件状态等于已付款,在单个查询中显示给我的用户
我的供应商表如下所示
| ID | vendor_name |
+----+------------------+
| 1 | Marakel Medicine |
| 2 | Ignacio Pharmacy |
| 3 | Rico Medicines |
| 4 | Marco Pharmacy |
+----+------------------+
我的药品表如下所示。
| ID | vendor_id | medicine_name | Status |
+----+-----------+----------------+---------+
| 1 | 1 | paracetamol #1 | paid |
| 2 | 1 | paracetamol #1 | paid |
| 3 | 2 | paracetamol #1 | pending |
| 4 | 2 | paracetamol #1 | paid |
| 5 | 4 | paracetamol #1 | paid |
+----+-----------+----------------+---------+
我的愿望输出是这样的
+----+------------------+-----------+
| ID | vendor_name | Total Med |
+----+------------------+-----------+
| 1 | Marakel Medicine | 2 |
| 2 | Ignacio Pharmacy | 1 |
| 3 | Rico Medicines | 0 |
| 4 | Marco Pharmacy | 1 |
+----+------------------+-----------+
到目前为止,我的代码在下面,我能够为每个供应商输出我只是不知道如何根据那里的状态来计算它们,任何建议都会很棒!
SELECT * FROM vendors LEFT JOIN medicine ON vendor.ID = medicines.vendor_id
【问题讨论】:
提示:GROUP BY
.
【参考方案1】:
根据状态[已付款或待处理]和供应商名称对表进行操作:
提议的查询:
SELECT vendor.ID, vendor.vendor_name,
COUNT((CASE WHEN [status] <> 'pending' THEN 1 END)) AS 'Total Med'
FROM medicines RIGHT OUTER JOIN
vendor ON medicines.vendor_id = vendor.ID
GROUP BY vendor.vendor_name, vendor.ID
注意: 此查询已在MSSQL中完成,您可以参考逻辑并在MySQL中尝试。
对应的MySQL语法:
SELECT vendor.ID, vendor.vendor_name,
COUNT((CASE WHEN status <> 'pending' THEN 1 END)) AS 'Total Med'
FROM medicines
RIGHT OUTER JOIN vendor ON
medicines.vendor_id = vendor.ID GROUP BY vendor.vendor_name, vendor.ID
【讨论】:
这很好用,谢谢!有没有办法优化查询很慢,因为这将是未来的一个大数据库。 很高兴看到该查询节省了您的时间。在优化查询之前,我建议您了解逻辑并尝试一些类似的示例。关于优化查询,可以完成几个步骤,例如索引或找出最多延迟发生的部分,一些 SO 帖子供您帮助:***.com/questions/3801188/sql-query-optimization; ***.com/questions/18152633/… 请注意,没有人使用 RIGHT JOIN @Strawberry 查询有问题吗?请分享您的想法..谢谢 更常见的是这样写:SELECT v.ID , v.vendor_name , SUM(status 'pending') 'Total Med' FROM vendor v LEFT JOIN drugs m ON m.vendor_id = v.ID GROUP BY v.ID , v.vendor_name;此外,vendor_name 存在函数依赖关系,因此它包含在 GROUP BY 中并不是绝对必要的——但好的做法都是一样的。【参考方案2】:使用GROUP BY
和COUNT
SELECT
v.ID,
v.vendor_name,
COUNT(m.vendor_id) AS 'Total Med'
FROM
vendors v
LEFT JOIN medicine m ON v.ID = m.vendor_id
GROUP BY
v.ID
【讨论】:
查询不会根据 OP 的需要获取输出【参考方案3】:@tharif 的 MSSQL 解决方案的 MYSQL 版本。
SELECT
v.ID,
v.vendor_name,
COUNT((CASE WHEN m.`status` <> 'pending' THEN 1 END)) AS 'Total Med'
FROM
vendor v
LEFT JOIN medicines m ON v.ID = m.vendor_id
GROUP BY v.ID
如果您不熟悉这些内容,最好阅读 group by 和 count。
【讨论】:
【参考方案4】:你应该试试这个
SELECT v.ID,v.vendor_name,COUNT(m.ID) as `Total`
FROM vendor v LEFT JOIN medicines m ON v.ID=m.vendor_id
GROUP BY m.ID
【讨论】:
它给了我unknow column vendor.ID
错误仍在处理它并试图让它工作。
可能是您的该供应商表的列名很小,请检查该列名,【参考方案5】:
使用 Group By 它的一个 sql 函数并使用 count 它也是一个 sql 内置函数..一些类似的如下所示。
SELECT vendors.id,vendors.vendor_name,COUNT(medicine.vendor_id) AS 'Total Transaction'
FROM vendors LEFT JOIN medicine ON vendors.id = medicine.vendor_id
GROUP BY vendors.id
【讨论】:
它只是为了举例,发布问题的用户确实知道 id 或 ID 是什么 现在可以添加表名让您满意以上是关于Mysql连接两个表并根据主键计算总记录的主要内容,如果未能解决你的问题,请参考以下文章