2011-02-07 24 views
1

TABLE1(IDSが常に存在する)3つのテーブルは、ケース内にデータが1つのテーブルに

+----+------+ 
| id | col1 | 
+----+------+ 
| 1 | ab | 
+----+------+ 
| 2 | gh | 
+----+------+ 

表2(IDが常に存在する)

+----+------+ 
| id | col2 | 
+----+------+ 
| 1 | cd | 
+----+------+ 
| 2 | ij | 
+----+------+ 

表3(IDSが失われるかもしれないが、欠落している、参加左この場合には)が不足している

+----+------+ 
| id | col3 | 
+----+------+ 
| 1 | ef | 
+----+------+ 

PHP

$col = 'ab'; 

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2, table3 AS t3 
WHERE t1.id = t2.id AND t2.id = t3.id AND (t1.col1 = '$col' OR t2.col2 = '$col' 
OR t3.col3 = '$col) GROUP BY t1.id, t2.id, t3.id"); 

すべての3つのテーブルが含まれている「同じID」を持っていたが、「idは」表3に欠落している場合、何が何らかの理由で発生した場合にのみ動作します ? $ col = abのとき、3つのテーブルをすべてテストしてt1.idに1を出力するにはどうすればよいですか?私はに参加する必要がありますか?に参加しますか?

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2 
LEFT JOIN (SELECT id FROM table3 WHERE col3 = '$col') AS t3 ON t3.id = t1.id 
WHERE t1.id = t2.id AND (t1.col1 = '$col' OR t2.col2 = '$col') 
GROUP BY t1.id, t2.id"); 

私はここで間違っていますか?

+0

文脈なしでは、達成したいことを理解するのは難しいです。どのデータを取得したいのですか、テーブル間の相関関係は何ですか? – jishi

答えて

1

何を間違っていますか?存在しないテーブルのクエリ。それはいつもエラーを起こすでしょう。

私は、あなたの質問に不可欠なテーブルが出て行くデータベースを設計する知恵には触れません。クライアント側の

あなたの唯一の希望は、あなたが興味を持っている テーブルの存在のためのテスト、および

    • には、それらの結果に基づいて、異なるSQL文 を実行しています。
    [あなたの編集後]


    あなたが1つのまたは2つの左外部結合必要なようですね。これにより、table3にあるかどうかにかかわらず、table1とtable2の両方に共通するすべてのIDが得られます。

    select t1.id, t2.id, t3.id 
    from table1 t1 
    inner join table2 t2 on (t1.id = t2.id) 
    left join table3 t3 on (t1.id = t3.id); 
    

    そして、これは関係なく、表2または表3

    select t1.id, t2.id, t3.id 
    from table1 t1 
    left join table2 t2 on (t1.id = t2.id) 
    left join table3 t3 on (t1.id = t3.id); 
    

    にいるかどうかの、あなたは表1にあるすべてのIDを与えると、もちろん、あなたがして結果をフィルタリングすることができますWHERE句。

  • +0

    私はそれが混乱の原因になることを知っていたので、私はその投稿を更新しました。テーブルは常に存在しますが、特定の "ids"は含まれません) –

    0

    LEFT JOINは、テーブルが存在し、データが存在しない場合にのみ機能します。

    Catcall suggestedのようなことをしたくない場合(テーブルが存在するかどうかを確認し、それに基づいて異なるSQLステートメントを使用する場合)、テーブルがデータベースに存在することを確認する必要がありますそれが完全に空の場合。

    通常は、アプリケーションのデータベースをある程度制御する必要があるため、テーブルが実際に存在することを確認する必要があります。

    これは本当に大きな問題(誰かがテーブルを削除したかどうかわからないなど)がある場合は、アプリケーションを起動するたびにチェックすることができます。テーブルが存在しない場合は作成してください。

    関連する問題