2

ID が他のテーブルに存在しない場合にこれを行う方法を説明するたくさんの質問がありますが、このクエリの解決策ではありません。

基本的に、私はワインのヴィンテージのテーブルを 1 つ持っています。

次に、特定のヴィンテージ (ビデオ、ブログなど) に関連付けられたさまざまな種類のコンテンツを含む 4 つのテーブルがあります。

基本的に、使用中のヴィンテージのリスト、つまりヴィンテージ ID が 4 つのコンテンツ テーブルの 1 つまたは複数で使用されている場所のリストを取得できる必要があります。

私が得ることができる最も近いものはこれです:

SELECT DISTINCT vintage_id FROM `pr_video_vintage`
INNER JOIN pr_video ON pr_video.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_reports ON pr_reports.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_reports_notes ON pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id
INNER JOIN pr_blog_entries ON pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id
ORDER BY `pr_video_vintage`.`vintage_id` ASC

しかし、これは(当然のことだと思いますが)すべてのテーブルに存在するIDのみを返します。

私が必要としているのは、何らかの形式の「OR」結合ですが、これを行う方法についての情報が見つかりません。

チップ?:)

4

3 に答える 3

3

これを試して:

SELECT  distinct vintage_id FROM `pr_video_vintage`
where exists(select 1 from pr_video where pr_video.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_reports where pr_reports.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_reports_notes where pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id)
   or exists(select 1 from pr_blog_entries where pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id)

また

    SELECT  distinct vintage_id FROM `pr_video_vintage`
where pr_video_vintage.vintage_id in (select pr_video.fk_vintage_id from pr_video)
   or pr_video_vintage.vintage_id in (select pr_reports.fk_vintage_id from pr_reports)
   or pr_video_vintage.vintage_id in (select pr_reports_notes.fk_vintage_id from pr_reports_notes)
   or pr_video_vintage.vintage_id in (select pr_blog_entries.fk_vintage_id from pr_blog_entries)

また

SELECT  distinct vintage_id FROM `pr_video_vintage`
where pr_video_vintage.vintage_id in (
   select pr_video.fk_vintage_id from pr_video
   union
   select pr_reports.fk_vintage_id from pr_reports
   union
   select pr_reports_notes.fk_vintage_id from pr_reports_notes
   union
   select pr_blog_entries.fk_vintage_id from pr_blog_entries)
于 2012-09-30T21:32:35.153 に答える
1

OUTER JOIN または LEFT/RIGHT JOIN を使用してみてください。OUTER JOIN は、両方のテーブルに存在しないエントリを含むすべてのエントリのデカルト積を計算します。LEFT JOIN は、右側に存在するかどうかに関係なく、ON ステートメントの左側のテーブル内のすべてを示し、RIGHT JOIN はその逆を行います。

また、キーストロークを節約したい場合は、INNER JOIN は JOIN と同じです。

于 2012-09-30T21:32:15.780 に答える
0

すべてのLEFT JOINリンクが NULL である行を除外する句と組み合わせて、存在しないリンクの NULL Id を返す sを実行できます。

SELECT DISTINCT vintage_id FROM `pr_video_vintage`
LEFT JOIN pr_video
    ON pr_video.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_reports
    ON pr_reports.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_reports_notes
    ON pr_reports_notes.fk_vintage_id = pr_video_vintage.vintage_id
LEFT JOIN pr_blog_entries
    ON pr_blog_entries.fk_vintage_id = pr_video_vintage.vintage_id
WHERE
    pr_video.fk_vintage_id IS NOT NULL
    OR
    pr_reports.fk_vintage_id IS NOT NULL
    OR
    pr_reports_notes.fk_vintage_id IS NOT NULL
    OR
    pr_blog_entries.fk_vintage_id IS NOT NULL
ORDER BY `pr_video_vintage`.`vintage_id` ASC
于 2012-09-30T21:33:18.823 に答える