根据当前表列的值,从sql中获取另一个表的数据

问题描述 投票:0回答:1

我正在尝试编写一个 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` 
mysql node.js select sequelize.js case
1个回答
0
投票

您的 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
语句来处理公司和机构的不同情况。通过这种方式,您可以获得包含公司和机构的供应商信息的结果。

© www.soinside.com 2019 - 2024. All rights reserved.