1

MySQL データベースから投稿されていない広告のみを取得しようとしています。

ad_title、items、posted_ads の 3 つのテーブルがあります。

ad_title - title_id、title、item_id

アイテム - item_id、ad_body、アカウント

posted_ads - post_id、title_id、item_id、アカウント

特定のアカウントに投稿されていない ad_titles / アイテムのリストを取得しようとしましたが、成功しませんでした。これが私のクエリです:

SELECT * 
FROM 
  ad_title t
  JOIN items l 
   ON ( l.item_id= t.item_id
   AND l.accounts LIKE  '%myaccount@email.com%' ) 
WHERE NOT EXISTS (
  SELECT q.item_id
  FROM posted_ads q
  WHERE q.acc_used =  'myaccount@email.com'
)

どんな助けでも大歓迎です。

ありがとうございました

4

1 に答える 1

1

クエリの現在の形式では、サブクエリには外側のクエリに関連付けるために何も含まれていないad_title.items_id NOT IN (...)ため、サブクエリで使用する必要がありますNOT EXISTSWHERE

SELECT
  /* Don't actually SELECT * in a JOIN query. Be explicit about the needed columns */
  /* especially since you have item_id in all tables */
  t.*,
  l.* 
FROM 
  ad_title t
  JOIN items l 
   ON ( l.item_id= t.item_id
   AND l.accounts LIKE  '%myaccount@email.com%' ) 
WHERE
  /* Find item_id via NOT IN */ 
  t.item_id NOT IN (
    SELECT q.item_id
    FROM posted_ads q
    WHERE q.acc_used =  'myaccount@email.com'
  )

として機能させるにNOT EXISTSは、サブクエリを外部クエリに関連付ける必要があります。

WHERE NOT EXISTS (
  SELECT q.item_id
  FROM posted_ads q
  WHERE 
    q.acc_used =  'myaccount@email.com'
    /* Need relation to the outer query */
    AND q.item_id = l.item_id
) 

LEFT JOINしかし、これはで を探して でNULL行うこともできますposted_ads。これが最も効率的な方法です。

SELECT
  /* Don't SELECT * in a JOIN query. Be explicit about the needed columns */
  t.*,
  l.* 
FROM 
  ad_title t
  JOIN items l 
   ON ( l.item_id= t.item_id
   AND l.accounts LIKE  '%myaccount@email.com%' ) 
  LEFT JOIN 
    posted_ads q 
      ON l.item_id = q.item_id
      AND q.acc_used = l.accounts
WHERE
  /* NULL in the posted_ads table means it doesn't exist there */ 
  posted_ads.item_id IS NULL
于 2013-02-25T00:58:37.230 に答える