2017-04-24 7 views
0

私はどのようにしたいのですか?ベストプラクティスのために別のアプローチを取っています。これはドキュメンテーションを読んで作成されたので、私はログの周りを回っていたかもしれません。値が別のテーブルにある場合は、特定の列を選択してください

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つしかない場合を除き、おそらく間違った結果が出ている可能性があります。これをここで 'AND '1' IN(SELECT practitioner_id FROM bookings)'と呼びます。これは、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

関連する問題