我正在try 编写一个SQL查询来列出所有用户以及供应商信息. 在tbl_USERS表中,列VENDOR_TYPE只能有COMPANY或PROJECTION,而我正在存储 根据供应商类型的值,供应商ID中的公司ID或机构ID.

Example 1:在tbl_users的第一行,user_id=1vendor_type的值是company,所以我想从tbl_company表中获得供应商数据,其中company_id(vendor_id) = 2.

Example 2:同样,在tbl_users的第二行中,user_id=2vendor_type的值是agency,所以我想从tbl_agency表中获得供应商数据,其中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 |
+-----------+-------------+---------------+--------------+

我try 了下面的查询,但没有得到结果.

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表与基于vendor_typetbl_companytbl_agency联接.以下是更正后的查询:

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 JOINtbl_users中的信息与基于vendor_typetbl_companytbl_agency组合在一起.它从每个表中 Select 相关列,并使用CASE条语句来处理公司和代理的不同 case .这样,您就会得到一个包括公司和代理的供应商信息的结果.

Mysql相关问答推荐

MySQL 8.0.34-从后端系统管理AWS RDS上的持久连接内存使用

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

如何在使用VALUES()插入时指定jOOQ中的行别名

最终的自联表是如何记住关联的呢?

Mysql - 按周分组但从 1 开始计数

Group By 查询运行速度太慢而无法正常运行

如何在 Shopware 6 DAL 中实施 Haversine 公式?

Select 不同的列,其中另一列不包含特定值

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

根据使用 mysql 的第一个过滤结果添加更多表行

JOOQ:如何将 POJO 列序列化为 JSON

mysql从另一个表中 Select 不相等的值

使用带有 ELSEIF 和 ELSE 的 3 列更新问题

PHP PDO 与普通 mysql_connect

字符ي和ی以及波斯语的区别 - Mysql

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

在 MySQL Workbench EER 图中的多个列上创建唯一约束

MySQL与空值比较

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源

cron 启动的 mysqldump 和密码安全