2017-04-24 99 views
0

我有工作,我怎麼想的聲明,不過是它正確的方式,因爲我有很多的IF語句,如果對性能的影響還是我應該知道採取不同的方法來獲得最佳實踐。這是從閱讀文檔創建的,所以我可能已經繞過它的日誌方式。如果值是另一個表,然後選擇特定的列

SELECT c.id, c.first_name, c.last_name, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.address1, NULL) as address1, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.address2, NULL) as address2, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.town, NULL) as town, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.county, NULL) as county, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.postcode, NULL) as postcode, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.email, NULL) as email, 
IF(c.id IN (SELECT client_id FROM bookings) AND '1' IN (SELECT practitioner_id FROM bookings) , c.dob, NULL) as dob 
FROM clients c 
+1

你到底想幹什麼? –

+0

不,這絕對不是正確的,它極有可能是給你錯誤的結果,除非你在預訂表中只有一行。藉此這裏'和「1」 IN(SELECT practitioner_id FROM預訂)'它完全無視它似乎檢查如果c.id是表預訂此前的說法。你可能認爲它應該與之相關,但事實並非如此。 –

+0

我試圖只返回客戶信息,如果他們已經與當前登錄的人預訂,否則登錄的人只能看到名字和姓氏。聲明給出了正確的輸出,只是想確保我沒有學習壞習慣。 – Bish25

回答

3

你應該採取不同的方法。

我猜測你想要的其他列時,相應的預訂具有1的從業者,我不是100%肯定,因爲你的查詢做了略有不同。

但總的想法是這樣的:

SELECT c.id, c.first_name, c.last_name, 
     (CASE WHEN b.client_id IS NOT NULL THEN c.address1 END) as address1, 
     . . . 
FROM clients c LEFT JOIN 
    bookings b 
    ON c.id = b.client_id AND b.practitioner_id = 1; 

填寫的. . .你想要的附加列。

+0

的作品,以及,我能得到一些更多的信息,爲什麼使用情況比較好?謝謝 – Bish25

+1

@ bish25。 。 。 CASE是ANSI標準語法。我更喜歡標準語法。但這是這個查詢中最不重要的變化。 –

+0

感謝您的幫助,再次感謝:) – Bish25

相關問題