【问题标题】:sql query one table with union and orderbysql用union和orderby查询一张表
【发布时间】:2012-07-19 05:21:03
【问题描述】:

我这里有个问题。

现在我有三个表(宠物、地址、联系人):

USER TABLE COLUMNS:
          PET_ID_PK
          PETNAME
          ADDRESS_ID_FK
          CONTACT_ID_FK
          GENDER
          OWNER_ID
          BOUGHT_DATE

ADDRESS TABLE COLUMNS:
          ADDRESS_ID_PK
          ADDRESS_STRING

CONTACT TABLE COLUMNS:
          CONTACT_ID_PK
          CONTACT_NUMBER

我想将这些表与列合并为一个表:

          PET_ID_PK
          PETNAME
          ADDRESS_STRING
          CONTACT_NUMBER
          GENDER

我希望得到属于特定OWNER_ID的宠物,并按照GENDER的顺序显示行(先是FEMALE,然后是MALE)。在这种情况下,我可以使用 ORDER BY CASE。

但是在每个用户表条目中,ADDRESS_ID_FK 或 CONTACT_ID_FK 都将为 NULL 值。 因此,参考Unioning Two Tables With Different Number Of Columns 中提供的解决具有 NULL 值的列的解决方案,我提出了以下查询:

SELECT DISTINCT ON (pets.pet_id_pk) * FROM 
((SELECT pet_id_pk, petname, address_string, NULL AS contact_id_fk, gender 
     FROM user JOIN address ON address.address_id_pk=address_id_fk) 
UNION 
(SELECT pet_id_pk, petname, NULL AS address_string, contact_id_fk, gender 
    FROM user JOIN address ON contact.contact_id_pk=contact_id_fk) AS pets 
WHERE OWNER_ID=$1 ORDER BY (CASE WHEN gender=female ELSE 2 END), bought_date DESC

但是这个查询没有相应地工作。

希望有人可以帮助我解决这个问题。谢谢。

【问题讨论】:

  • not working accordingly 是什么意思?

标签: mysql sql phpmyadmin


【解决方案1】:

请尝试以下:

SELECT u.pet_id_pk, u.petname, a.address_string, c.contact_number, u.gender 
FROM user u
LEFT JOIN address a ON u.address_id_fk=a.address_id_pk
LEFT JOIN contact c ON u.contact_id_fk=c.contact_id_pk
WHERE OWNER_ID=$1 ORDER BY u.gender,bought_date DESC

您可以使用左连接。即使没有匹配结果,LEFT JOIN 也会显示表格。

对于 ORDER BY,我真的不认为需要使用 CASE,因为仅使用 ORDER BY,它将显示 FEMALE 跟随 MALE。使用 ORDER BY CASE 有什么具体原因吗?

【讨论】:

  • 这很好,但结果会有所不同:LEFT JOIN 将导致既不在地址也不在联系中的行也显示出来。您需要在 where 中添加一个附加子句,说明 address_string 或 contact_number 不应为 NULL 以使查询等效。
  • @Konerak 对不起,我真的不明白你。我确实希望显示 NULL 值。
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多