2017-04-24 97 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

相关问题