【问题标题】:How to show rows that don't have a specific value?如何显示没有特定值的行?
【发布时间】:2020-02-22 23:23:22
【问题描述】:

我对 SQL 比较陌生,我需要显示其中没有特定值的行,而无需为其添加值到表中。我正在使用的表是:

 Select * from PERSON;
+-------+-------+---------+--------+---------+----------+
| idnum | fname | lname   | rname  | private | linkblue |
+-------+-------+---------+--------+---------+----------+
| 11111 | Bob   | Bobsley | Robert |       0 | bob1111  |
| 93210 | Bowen | Travis  | Luke   |       1 | tlbo232  |
+-------+-------+---------+--------+---------+----------+
Select * from ADVISOR;
+---------+---------+-------+-------+ You can ignore the sdate and edate
| student | advisor | sdate | edate |
+---------+---------+-------+-------+
|   11111 |   93210 | NULL  | NULL  |
|   93210 |   11111 | NULL  | NULL  |
+---------+---------+-------+-------+
Select * from DIGITAL;
+----------+-------+-------------------------+
| smtype   | idnum | smaddr                  |
+----------+-------+-------------------------+
| email    | 11111 | bob1111@uky.edu         |
| email    | 93210 | tlbo232@uky.edu         |
| facebook | 11111 | bob1111@facebook.com    |
| facebook | 93210 | tlbo232@facebook.com    |
| twitter  | 11111 | twitter.com/bob.bobsley |
+----------+-------+-------------------------+

目标是打印出学生姓名、他们的电子邮件、顾问的姓名和他们的推特。所以是这样的:

+------------+-----------+-----------------+--------------------+-------------------+-------------------------+
| First Name | Last Name | Email           | Advisor First Name | Advisor Last Name | Advisor Twitter         |
+------------+-----------+-----------------+--------------------+-------------------+-------------------------+
| Bowen      | Travis    | tlbo232@uky.edu | Bob                | Bobsley           | twitter.com/bob.bobsley |
+------------+-----------+-----------------+--------------------+-------------------+-------------------------+

来自:

select 
    P.fname as 'First Name', 
    P.lname as 'Last Name', 
    D.smaddr as 'Email', 
    AdivsorList.fname as 'Advisor First Name',
    AdivsorList.lname as 'Advisor Last Name', 
    AdivsorList.smaddr as 'Advisor Twitter' 
from PERSON P 
LEFT OUTER JOIN DIGITAL D ON P.idnum = D.idnum 
LEFT OUTER JOIN (
    SELECT P1.fname, P1.lname, A.advisor, D1.smaddr, D1.smtype
    from ADVISOR A 
    LEFT OUTER JOIN PERSON P1 ON A.student = P1.idnum 
    LEFT OUTER JOIN DIGITAL D1 ON P1.idnum = D1.idnum
) as AdivsorList ON P.idnum = AdivsorList.advisor 
where D.smtype = 'email' AND AdivsorList.smtype = 'twitter';

输出应该显示两行,但其中一行没有 twitter,所以它不会显示。我正在寻找一种方式来展示它。

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    这可以通过一系列left joins 来完成:

    select
        ps.fname  student_fname,
        ps.lname  student_lname,
        ds.smaddr student_email
        pa.fname  adviser_fname,
        pa.lname  adviser_lname,
        da.smaddr advisor_twitter
    from person ps
    left join advisor a  on a.student = ps.idnum
    left join person  pa on pa.idnum  = a.advisor
    left join digital ds on ds.idnum  = ps.idnum and ds.smtype = 'email'
    left join digital da on da.idnum  = pa.idnum and da.smtype = 'twitter'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多