0

2つのテーブルを結合して、特定のレコードのみを取得するにはどうすればよいですか?

私は2つのテーブルを持っています

  1. サプライヤー-列(supp_id、、、、)supp_codesupp_nameaddress
  2. SelectedSuppliers-列(supplier_id、、is_selecteddate_a)

すべてのサプライヤをグリッドビューにロードし、チェックボックスで特定のサプライヤを選択します

サプライヤテーブルからの特定の日付については、SelectedSupplierテーブルに移動します。

保存したサプライヤをSelectedSupplierテーブルからロードする場合、2つのテーブルからすべてのサプライヤを表示する必要があります。つまり、新しいサプライヤを追加した場合、2回目のロード時に表示されるはずです。

これは私の質問です

SELECT
    `supplier`.`supp_id`,
    `supplier`.`supp_name`,
    `supplier`.`address`,
    `supplier`.`supp_code`,
    `SelectedSuppliers `.`is_selected`
FROM 
    `SelectedSuppliers `
LEFT JOIN 
    `supplier` ON (`shop_list`.`supplier_id` = `supplier`.`supp_id`)
WHERE
    SelectedSuppliers.date_a = '2013-1-5'

動作しますが、レコードをロードSelectedSupplierするのはすべてのレコードだけではありません

ありがとう。

4

5 に答える 5

2
SELECT
  `supplier`.`supp_id`,
  `supplier`.`supp_name`,
  `supplier`.`address`,
  `supplier`.`supp_code`,
  `SelectedSuppliers `.`is_selected`
FROM 'supplier',`SelectedSuppliers`
  LEFT JOIN `supplier`
    ON (`shop_list`.`supplier_id` = `supplier`.`supp_id`)
where SelectedSuppliers.date_a = '2013-1-5'

画像をご覧くださいここに画像の説明を入力してください

于 2013-01-28T05:57:24.523 に答える
1

結合の順序を逆にして、条件をON句に移動するだけで、左側の結合が引き続き機能するようになります。

SELECT
  `supplier`.`supp_id`,
  `supplier`.`supp_name`,
  `supplier`.`address`,
  `supplier`.`supp_code`,
  `SelectedSuppliers `.`is_selected`
FROM `supplier`
LEFT JOIN `SelectedSuppliers ` 
    ON `shop_list`.`supplier_id` = `supplier`.`supp_id`
    AND SelectedSuppliers.date_a = '2013-1-5'

suppliers最初から選択してからに参加すると、すべてのサプライヤ行が表示されます。

注:一般的に(そして誤って)、ON句には「キー関連」条件のみが含まれる可能性がありますが、実際には任意の条件が含まれる可能性があります(結合されているテーブルに関連しない条件も含まれます)。

于 2013-01-28T05:57:31.293 に答える
0

is_selected列に入力する情報はすべて、その情報が提供されているかどうかを確認するために、where条件で使用します。デフォルトで0(選択されていない場合)であり、それらのレコードをロードする場合は、単純に次のように入力します。where SelectedSuppliers.is_selected = 0

于 2013-01-28T06:03:03.217 に答える
0

shop_listへの参照がある理由、そのテーブルまたはエイリアスがクエリに表示されない理由、またはテーブル名の1つに末尾のスペースが含まれている理由はまったくわかりません。

supplierあなたの説明から、あなたはLEFT JOINの左側にいることを望んでいると思います(supplierテーブルからすべての行を返すため)。

(への参照をへの参照に置き換えましshop_listSelectedSuppliers。クエリ例のように、テーブル名の末尾にスペースを残しました。)

SELECT s.supp_id
     , s.supp_name
     , s.address
     , s.supp_code
     , e.is_selected
  FROM `supplier` s
  LEFT 
  JOIN `SelectedSuppliers ` e
    ON e.supplier_id = s.supp_id
   AND e.date_a = '2013-1-5'

すべての行は、左側のテーブルから(このクエリではsupplier)、右側のテーブルから一致する行とともに返されます。

is_selectedSelectedSuppliersテーブルに一致する行がない場合、inの値はNULLになります。これは、必要に応じて、IFNULL関数でラップすることにより、簡単に0に置き換えることができます。

すでに選択されているサプライヤを除外することが目的の場合は、クエリに単純な述語を追加して、一致する行を削除できます。

WHERE e.supplier_id IS NULL 

これにより、テーブルにsupplier一致する行がない場所から行が返されます。SelectedSuppliers

于 2013-01-28T06:04:52.687 に答える
0

このフォームを使用

SELECT A1,A2,...
FROM TABLE1,TABLE2,TABLE3,....
WHERE ......

注: From table names は、where 句を指定して選択したすべての値のデカルト積を作成します。

于 2013-01-28T05:53:56.653 に答える