3

これを行う方法がよくわかりません:

SELECT contacts.first_name,
       contacts.last_name,
       (
            SELECT quotes.id
            FROM quotes 
            LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
            WHERE quotes.id IS NOT NULL
            AND quotes_contacts.contact_id = contacts.id
            ORDER BY quotes.date_entered
            LIMIT 1
        ) AS 'first_quote'
FROM
contacts

ただし、として返される値の一部は、としてfirst_quote返されnullます。どうすればそれを止めることができますか?

4

2 に答える 2

1

subselect ではなくINNER JOIN、サブクエリに対して an を使用します。これにより、NULL が削除されます。

SELECT contacts.first_name,
       contacts.last_name,
       quote_id AS first_quote
FROM 
  contacts 
  INNER JOIN (
    SELECT quotes.id, quotes_contacts.contact_id
    FROM 
     quotes 
     LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
     JOIN (
       SELECT quotes_contacts.contact_id, MIN(quotes.date_entered) AS date_entered
       FROM 
             quotes 
         JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
         GROUP BY contact_id
     ) minquote ON quotes.date_entered = minquote.date_entered AND qc.contact_id = minquote.contact_id
   ) firstquote ON contacts.id = firstquote.contact_id 

これは、が増加し、最も低いperが最も早いであることが確実な場合に、より簡単になります。その場合、あなたはただ行うことができますquote.idquote.idcontact_iddate_enteredMIN(quote.id)

SELECT contacts.first_name,
       contacts.last_name,
       quote_id AS first_quote
FROM 
  contacts 
  INNER JOIN (
    SELECT MIN(quotes.id) AS quote_id, quotes_contacts.contact_id
    FROM quotes
    LEFT JOIN  quotes_contacts ON quotes.id = quotes_contacts.quote_id
    GROUP BY contact_id
  )minq ON contacts.id = minq.contact_id
于 2012-10-17T13:31:58.413 に答える
0

副選択が行を検出し、その値idがヌルの場合、WHERE句はその行が返されないようにします。ただし、副選択で何も見つからない場合は常に、の値はfirst_quotenull のままです。外側に追加のガードを配置すると、うまくいくはずです。

SELECT contacts.first_name,
       contacts.last_name,
       (
            SELECT quotes.id
              FROM quotes 
              LEFT JOIN quotes_contacts ON quotes.id = quotes_contacts.quote_id
             WHERE quotes.id IS NOT NULL
               AND quotes_contacts.contact_id = contacts.id
             ORDER BY quotes.date_entered
             LIMIT 1
        ) AS 'first_quote'
 FROM contacts
WHERE first_quote IS NOT NULL

ただし、ここではサブセレクトよりも JOIN の方が効率的です。

于 2012-10-17T13:33:44.457 に答える