0

私がやりたいのは、一意の参照によって識別される1つの行に3つの別々のテーブルをクエリすることです。Join各テーブルから何らかの関連データが必要なようであるため、この句を完全には理解していません。

私はこれを長い道のりで進めることができることを知っていますが、少しでも効率を失うわけにはいきません。どんな助けでも大歓迎です。

テーブル構造

    package_id int(8),
    client_id int(8),
    unique reference varchar (40)

各テーブルの構造は基本的に同じです。1行について、3つすべてをクエリする方法を知る必要があります。

4

5 に答える 5

0

3つのテーブルがあるとしましょう:

構造を持つtable1、table2、table3

package_id int(8),
client_id int(8),
unique reference varchar (40)

列参照が一意キーであると仮定しましょう。

次に、これを使用できます。

SELECT t1.exists_row ,t2.exists_row ,t3.exists_row FROM
(
    (SELECT COUNT(1) as exists_row FROM table1 t1 WHERE 
         t1.reference = @reference ) t1,
    (SELECT COUNT(1) as exists_row FROM table1 t2 WHERE 
         t2.reference = @reference ) t2,
    (SELECT COUNT(1) as exists_row FROM table1 t3 WHERE 
         t3.reference = @reference ) t3
) a

;

@referenceを一意キーの実際の値に置き換えます

またはあなたがの出力を提供するとき

SHOW CREATE TABLE

実際のクエリでSQLを書き直すことができます

于 2012-06-01T08:56:42.997 に答える
0
SELECT * FROM table1 t1 JOIN table2 t2 ON (t2.unique = t1.unique) JOIN table3 t3 ON (t3.unique = t1.unique) WHERE t1.unique = '?';

3つのテーブルすべてに同じ一意の列があると仮定すると、このようなJOINを使用できます。

于 2012-06-01T08:57:40.257 に答える
0

同じまたは類似の定義を共有しているテーブルがほとんどない場合は、unionまたはunion allを使用して、それらを1つとして扱うことができます。このクエリは、参照を要求した各テーブルから行を返します。OriginTableコードが更新などのために元のテーブルを参照する必要がある場合に備えて、情報を含めました。

select 'TableA' OriginTable, 
       package_id, 
       client_id
  from TableA
 where reference = ?
 union all
select 'TableB' OriginTable, 
       package_id, 
       client_id
  from TableB
 where reference = ?
 union all
select 'TableC' OriginTable, 
       package_id, 
       client_id
  from TableC
 where reference = ?

同じデータ型を持っているか、最初の選択から暗黙的にデータ型に変換できる場合は、選択リストを他の列で拡張できます。

于 2012-06-01T09:01:59.720 に答える
0

where 句を使用して、テーブル間の結合を作成することは完全に可能です。実際、これは実際に行っていることのより明確な情報につながることがわかっているため、私がよく行うことであり、期待する結果が得られない場合は、少しずつデバッグできます。

そうは言っても、結合は確かに書くのがずっと速いです!

私は SQL に慣れていないので、覚えていない可能性があります。また、使用している DBMS について言及していないため、コードを含めるつもりはありません。コードはすべてわずかに異なります。

覚えておくべきことは、結合は同じデータ (および型) を持つ列に対して機能するということです。

各テーブルに同じ名前の「結合」フィールドがあると、はるかに簡単になります。

join on <nameOfField>

ただし、異なるテーブルで異なる名前を持つフィールドを使用する場合は、完全修飾名をリストする必要があります。つまり、tableName.FieldName

自然、内と外、左と右に問題がある場合は、テーブル間の共通点が自然であるベン図を考える必要があります。2 つのテーブルのみを使用している場合、内側と外側は左と右 (ベン図では各テーブルが 1 つの円) と同等であり、左と右は select のメイン部分のリスト内のテーブルの順序です ( 1 番目は左、2 番目は右です)。

3 番目のテーブルを追加すると、ここでこれらのキーワードを使用して任意のクロス オーバー セクションを選択できます。

ただし、プライマリ選択を実行して一時テーブルを作成し、この一時テーブルを使用して次の結合を実行する方が簡単であることが常にわかっています (効果的には、自然または左と右を再度使用するだけで済みます)。繰り返しますが、これはデバッグが簡単です。

最善の方法は、実験して、見返りに何が得られるかを確認することです。あなたのテーブルの図がなければ、これは私が提供できる最高のものです.

簡単に言えば...

ネストされた select where field = (テーブル where field = から選択)

および一時テーブル

(私が思うに)デバッグが簡単です...しかし、もっと書く必要があります!

デビッド。

于 2012-06-01T09:03:53.817 に答える
0
array_of_tables[]; // contain name of each table

foreach(array_of_tables as $val)
{
    $query="select * from `$val` where $condition "; // $conditon 
    $result=mysqli_query($connection,$query);
    $result_row[]=mysqli_fetch_assoc($result); // if only one row going to return form each table
    //check resulting array ,for your row
}
于 2012-06-01T09:04:26.037 に答える