2014-02-15 143 views
1

可以說,我有以下幾列一個成員表:MySQL if /條件查詢?

id, first, last, email, type, expires, parentid 

其中type可以是「父母」和「孩子」

如果我查詢的ID,它是一個孩子,我該怎麼辦返回孩子信息的名稱和父母的過期/名字?

基本上是這樣的:

select 
    first, 
    last, 
    email, 
    if (type = "child" 
     select 
     expires, 
     first as parent_first, 
     last as parent_last 
    from members 
    where id = parentid) 
    else (expires) 
    from members where id = 100 

回答

2

不要從動態爲本構建type = 'child'的SQL角度來處理它。相反,SQL在相關集上運行,因此解決方案實際上是針對表本身,以便始終返回父表(儘管有時可能爲空)。

雖然可以使用CASE與子選擇交替返回父母或子女expires獨自一人,因爲你也想父母的名字列的解決方案是總是回報他們,即使他們可能是NULL

SELECT 
    c.first AS first, 
    c.last AS last, 
    c.email AS email, 
    c.expires AS expires, 
    /* parent fields will be NULL if child parentid is NULL */ 
    p.first AS parent_first, 
    p.last AS parent_last, 
    p.expires AS parent_expires 
FROM 
    members c 
    /* join against the same table matching 
    parentid of the child to id of the parent */ 
    LEFT JOIN members p ON c.parentid = p.id 
WHERE 
    c.id = 100 

一個LEFT JOIN使用 - 因此,如果孩子有parentid沒有價值,父列將返回NULL。如果你只是想爲expires一個返回值,你可以使用COALESCE()喜歡父母的,回到孩子的,如果父母的爲空:

SELECT 
    ... 
    COALESCE(p.expires, c.expires) AS expires, 

或者使用CASE並檢查孩子的type(雖然COALESCE()是更好):

SELECT 
    ... 
    CASE WHEN c.type = 'child' THEN p.expires ELSE c.expires END AS expires 
+0

有趣。從事物的編碼方面來說,獲得不可能設置的東西的價值可能會造成麻煩(比如查詢一個不存在的列)......所以一定會解釋爲什麼我從來沒有看過這個方向。但是,這將要求我在演示文稿端「如果!過期然後是parent_expires」,我希望通過總是有一個「過期」來避免。感謝您的迴應和解釋! :) – Ahhk

+0

@Ahhk不,您不需要在演示文稿端執行「if!expires then parent_expires」。這就是'COALESCE()'爲你處理的。如果它存在,則返回父項到期,否則該子項過期(假定沒有父項) –

+1

啊!這一切都開始有意義了:)再次感謝。 – Ahhk