sql查询一个带union和orderby的表

时间:2012-07-19 05:21:04

标签: mysql sql phpmyadmin

我在这里遇到了问题。

现在我有三张桌子(宠物,地址,联系方式):

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

但是此查询无法正常工作。

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

1 个答案:

答案 0 :(得分: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。即使没有匹配结果,LEFT JOIN也会显示表格。

对于ORDER BY,我实际上并不认为需要使用CASE,因为只使用ORDER BY,它将显示FEMALE跟随MALE。您是否有使用ORDER BY CASE的具体原因?