简体   繁体   中英

Mysql joining two tables and counting total records based on primary key

I have two tables vendor and medicines on mysql database now i need to count total medicines transacted based on vendor ID with a condition status is equal to paid, in a single query and show it to my users

My vendor table looks like this

| ID |   vendor_name    |
+----+------------------+
|  1 | Marakel Medicine |
|  2 | Ignacio Pharmacy |
|  3 | Rico Medicines   |
|  4 | Marco Pharmacy   |
+----+------------------+

My Medicines table looks like this.

| 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    |
+----+-----------+----------------+---------+

My desire output would be like this

+----+------------------+-----------+
| ID |   vendor_name    | Total Med |
+----+------------------+-----------+
|  1 | Marakel Medicine |         2 |
|  2 | Ignacio Pharmacy |         1 |
|  3 | Rico Medicines   |         0 |
|  4 | Marco Pharmacy   |         1 |
+----+------------------+-----------+

So far my code is below i was able to output per vendor i just don't have an idea how to count them based on there status, any suggestion would be great!

SELECT * FROM vendors LEFT JOIN medicine ON vendor.ID = medicines.vendor_id

Join Operation on tables based on status [paid or pending] & vendor name :

Proposed Query :

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

在此处输入图片说明

Note: This query has been worked out in MSSQL, you can refer the logic and try for MySQL.

Corresponding MySQL Syntax:

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

在此处输入图片说明

Use GROUP BY and 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

you should try this

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

MYSQL version of @tharif's MSSQL solution.

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

It is a good idea to read on group by and count if you are new to these.

Use Group By its an sql function and also use count its also an sql built in function..some similar shown below.

    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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM