我正在尝试编写一个 SQL 查询来列出所有用户以及供应商信息。 在 tbl_users 表中,列供应商类型只能有公司或机构,我正在存储 基于vendor_type值的vendor_id中的company_id或agency_id。
示例1:在
tbl_users
的第一行,user_id=1
和vendor_type
的值是company
,所以我想从tbl_company
表中获取供应商数据,其中company_id(vendor_id) = 2
。
示例2:同样在
tbl_users
的第二行中,user_id=2
和vendor_type
的值是agency
,所以我想从tbl_agency
表WHERE agency_id(vendor_id) = 8
获取供应商数据。
tbl_users
+----------+----------+-------------+-----------+
| user_id | username | vendor_type | vendor_id |
+----------+----------+-------------+-----------+
| 1 | Vicky RT | company | 2 |
| 2 | Adam Sm | agency | 8 |
| 3 | Shane JK | company | 5 |
+----------+----------+-------------+-----------+
tbl_company
+------------+-------------+---------------+------------+
| company_id | name | contact_number| reg_date |
+------------+-------------+---------------+------------+
| 1 | ABC Pvt Ltd | 0123456789 | 2020-10-21 |
| 2 | XYZ Pvt Ltd | 1234567890 | 2008-08-15 |
+------------+-------------+---------------+------------+
tbl_agency
+-----------+-------------+---------------+--------------+
| agency_id | name | licence_number| logo |
+-----------+-------------+---------------+--------------+
| 8 | ABC Agency | O3BD3OU6FG | abc-3463.png |
| 9 | XYZ Agency | UDBD3N5O5W | xyz-3463.png |
+-----------+-------------+---------------+--------------+
我尝试了下面的查询,但没有得到结果。
SELECT user_id, username, vendor_type, vendor_id
CASE
WHEN vendor_type='company' THEN (SELECT company_id, name, contact_number, reg_date
FROM tbl_company WHERE tbl_company.company_id=tbl_users.vendor_id)
WHEN vendor_type='agency' THEN (SELECT agency_id, name, licence_number, logo
FROM tbl_agency WHERE tbl_agency.agency_id=tbl_users.vendor_id)
ELSE 'null'
END AS vendor_info
FROM `tbl_users`
您的 SQL 查询很接近,但您需要稍微修改一下语法。您应该使用
JOIN
子句将 tbl_users
表与基于 tbl_company
的 tbl_agency
或 vendor_type
连接起来。这是更正后的查询:
SELECT
u.user_id,
u.username,
u.vendor_type,
u.vendor_id,
CASE
WHEN u.vendor_type = 'company' THEN c.company_id
WHEN u.vendor_type = 'agency' THEN a.agency_id
END AS vendor_id,
CASE
WHEN u.vendor_type = 'company' THEN c.name
WHEN u.vendor_type = 'agency' THEN a.name
END AS vendor_name,
CASE
WHEN u.vendor_type = 'company' THEN c.contact_number
WHEN u.vendor_type = 'agency' THEN NULL
END AS contact_number,
CASE
WHEN u.vendor_type = 'company' THEN c.reg_date
WHEN u.vendor_type = 'agency' THEN NULL
END AS reg_date,
CASE
WHEN u.vendor_type = 'company' THEN NULL
WHEN u.vendor_type = 'agency' THEN a.licence_number
END AS licence_number,
CASE
WHEN u.vendor_type = 'company' THEN NULL
WHEN u.vendor_type = 'agency' THEN a.logo
END AS logo
FROM
tbl_users u
LEFT JOIN tbl_company c ON u.vendor_id = c.company_id AND u.vendor_type = 'company'
LEFT JOIN tbl_agency a ON u.vendor_id = a.agency_id AND u.vendor_type = 'agency';
此查询使用
LEFT JOIN
将 tbl_users
中的信息与 tbl_company
或基于 tbl_agency
的 vendor_type
组合起来。它从每个表中选择相关列,并使用 CASE
语句来处理公司和机构的不同情况。通过这种方式,您可以获得包含公司和机构的供应商信息的结果。