Mysql连接两个表并根据主键计算总记录

Posted

技术标签:

【中文标题】Mysql连接两个表并根据主键计算总记录【英文标题】:Mysql joining two tables and counting total records based on primary key 【发布时间】:2017-10-14 03:35:23 【问题描述】:

我在 mysql 数据库上有两个表 vendormedicines 现在我需要计算基于供应商 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 BYCOUNT

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连接两个表并根据主键计算总记录的主要内容,如果未能解决你的问题,请参考以下文章

求如何用mysql实现计算上下两条记录的差

PHP/SQL 查询:组合两个只有唯一记录的表并计算星期六

从mysql连接两个表并在一个JSP列表中显示信息[重复]

mysql查询加入,比较两个表并返回第一个表中的所有记录

MySQL:加入表并根据另一列上的聚合函数从一行返回一列[重复]

Azure 逻辑应用 - MySQL 连接器 - 根据需要插入显示自动递增主键字段的行操作