2011-11-16 12 views
8

ないつのテーブル内のフィールドを選択:PHPを使用MySQLの私は、MySQL DBで2つのテーブル有する別のテーブルに

Table 1 : id, galleryname 
Table 2 : galleryid, <many other fields...> 

を、私は、そのID、そのIDに基づいて、表1のすべての行を選択する必要が(galleryid)を表に表示されない2.

例: 表1

1, flowers 
2, water 
3, mountains 
4, winter 

表2

3, ... 

は、私がこれについて移動する方法を正確にはわからない。表1

1, flowers 
2, water 
4, winter 

からこれらの行を返します。私はMySQLの基本をよく理解していますが、これは私のリーグの外にあるJOINまたはUNIONであると思われます。

何か助けていただければ幸いです。

答えて

19

これを試してみてください:

SELECT * FROM table1 
WHERE id NOT IN 
    (SELECT galleryid FROM table2) 

または

SELECT * FROM table1 
LEFT JOIN table2 
    ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
+0

あなたの 'IN'ステートメントが機能するには、あなたのsub selectを'() 'にラップする必要があります。 –

+1

@AdamWenger:はい、私は...私はそれを忘れてしまったと確信しています!あなたの提案をありがとう! :) – Marco

7

左ジョインはNULL(T2でレコードなし)をt2.galleryidたものを除外し、その後、すべてのT1レコードをもたらし

SELECT id, galleryname 
FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.galleryid 
WHERE t2.galleryid IS NULL 
+0

何が起こっているかについての非常に明確なコメントを付けたきれいなクリーンなクエリ。大規模なテーブルでのサブ選択の使用はあまり良いことではないので、これは正解と問題を解決する最善の方法です。 – Shmarkus

2
SELECT * FROM table1 
LEFT JOIN table2 
ON table1.id = table2.galleryid 
WHERE table2.galleryid IS NULL 
1

誰かが回答を投稿しましたそれだけで私に両方のレコードを与えた)。他のすべてのものは間違いを見せましたが、その元の投稿を使用して私は1つの変更を加え、それが機能しました。

オリジナル:!

SELECT * FROM table1 INNER JOIN table2 ON galleries.id != images.galleryid 

(これは私が必要なものを私に与えた)

SELECT * FROM table1 INNER JOIN table2 ON galleries.id = images.galleryid 

の追加(これは私の両方にあったちょうど1を与えました)

+0

!=を使用した内部結合は非常に悪いことです。これは最初に2つのテーブルのデカルト積を作成し、一致する行を除外します。各テーブルの行数が増えると、これはひどく非効率的になります。 –

関連する問題