2017-09-28 21 views
0

私はready_for_clientとready_to_shipの2つのテーブルを持っています。両方のテーブルの構造はほぼ同じです。Mysqlクエリの2つのテーブルが条件付きで結合する

id (int) 
    client_id (int) 
    truck_id (int) 
    driver_id (int) 
    list (varchar 50) 
    is_done (tinyint 1) 

ready_for_clientはrts_id (varchar 32)を持っており、READY_TO_SHIPは私が欲しいものrfc_id (varchar 32)

を持っている三つの異なるクエリ、rts_idとrfc_idが同じで両方のテーブルを照会する最初のものです。私は最初のものを持っており、それは動作します。

SELECT rfc.id AS Ready_For_Client_id, rfc.rts_id, t.Truck_Number, u.Name AS User_Name, c.Name AS Client_Name FROM ready_for_client rfc 
     INNER JOIN trucks t ON rfc.truck_id = t.id 
     INNER JOIN users u ON rfc.driver_id = u.id 
     INNER JOIN clients c ON rfc.client_id = c.id 
     INNER JOIN ready_to_ship rts ON rfc.rts_id = rts.rfc_id 
    WHERE rfc.is_done = 0 

これは、必要なように1つのレコードを生成します。 2番目と3番目のクエリは、rfc_idとrts_idを共有していない両方のテーブルの他のすべてのレコードをそれぞれ選択したいと思います。

私は同じクエリを持っていると思っていましたが、4番目のINNER JOINには等しくないと思いました。

SELECT rfc.id AS Ready_For_Client_id, rfc.rts_id, t.Truck_Number, u.Name AS User_Name, c.Name AS Client_Name FROM ready_for_client rfc 
     INNER JOIN trucks t ON rfc.truck_id = t.id 
     INNER JOIN users u ON rfc.driver_id = u.id 
     INNER JOIN clients c ON rfc.client_id = c.id 
     INNER JOIN ready_to_ship rts ON rfc.rts_id != rts.rfc_id 
    WHERE rfc.is_done = 0 

しかし、これはレコードを2倍にし、共有rts_idとrfc_idを持つ1つのレコードも含めています。

私はこの2番目と3番目のクエリをどのように設定する必要があるか知っていますか?

- 編集 -

ready_for_client

+----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 
    | id | client_id | truck_id | driver_id | list      | rts_id       | is_done | 
    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 
    | 1 |   1 |  2 |   7 | 175      | 2bcd069351002c4d92ba151ae67212ad |  0 | 
    | 2 |   2 |  2 |   7 | 231      | 95e906dec3c83b1c9bfbe3f0d6920aaf |  0 | 
    | 3 |   2 |  1 |   7 | 88,89,90,91    | e82ac070985e21ced4fb203c515b1618 |  0 | 
    | 4 |   3 |  1 |   7 | 37,249,38,39,40,41,109,42 | d21b5ac4a4da0e57b85a464c3a6fd511 |  0 | 
    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+ 

READY_TO_SHIP

+----+-----------+----------+-----------+-------+----------------------------------+---------+ 
    | id | client_id | truck_id | driver_id | list | rfc_id       | is_done | 
    +----+-----------+----------+-----------+-------+----------------------------------+---------+ 
    | 1 |   3 |  1 |   7 | 1  | 10e938e49a67117273683535cebbe8cc |  0 | 
    | 2 |   3 |  1 |   7 | 2,3,4 | d21b5ac4a4da0e57b85a464c3a6fd511 |  0 | 
    +----+-----------+----------+-----------+-------+----------------------------------+---------+ 

2番目のクエリ用の出力、ready_for_clientから他のすべてのレコードを選択しようとしている:

+---------------------+----------------------------------+--------------+------------+----------------------+ 
    | Ready_For_Client_id | rts_id       | Truck_Number | User_Name | Client_Name   | 
    +---------------------+----------------------------------+--------------+------------+----------------------+ 
    |     1 | 2bcd069351002c4d92ba151ae67212ad |   20 | driver  | client name   | 
    |     1 | 2bcd069351002c4d92ba151ae67212ad |   20 | driver  | client name   | 
    |     2 | 95e906dec3c83b1c9bfbe3f0d6920aaf |   20 | driver  | client name   | 
    |     2 | 95e906dec3c83b1c9bfbe3f0d6920aaf |   20 | driver  | client name   | 
    |     3 | e82ac070985e21ced4fb203c515b1618 |   10 | driver  | client name   | 
    |     3 | e82ac070985e21ced4fb203c515b1618 |   10 | driver  | client name   | 
    |     4 | d21b5ac4a4da0e57b85a464c3a6fd511 |   10 | driver  | client name   | 
    +---------------------+----------------------------------+--------------+------------+----------------------+ 

これは、Read_For_Client_id 1 2と3のためのものでなければなりません。id 4はなく、1,2と3の倍数はありません。

+1

画像あなたは、私は*のように....あなたは見たことがないのテーブルの3つのクエリを生成し、常に(再利用可能なテキストまたはSQLインサートとして)「サンプルデータ」と「期待結果」*を提供するために、あなたを求めていることをできればこれにより、正確な回答が素早く得られます。 –

+0

あなたは 'where rfc.rts_id!= rts.rfc_id'のような条件であなたの解決策を教えてくれるかもしれません。 – Jenish

+0

申し訳ありませんが、それについては考えていません。いくつかのデータと2番目のクエリの結果を追加しました。 –

答えて

1

IDが等しくなく行の乗算を避ける必要があります。これには2つのテクニックがあります。

は、参加ところLEFTを使用して、JOINが、その後、それらを除外は

SELECT 
     rfc.id AS Ready_For_Client_id 
    , rfc.rts_id 
    , t.Truck_Number 
    , u.Name AS User_Name 
    , c.Name AS Client_Name 
FROM ready_for_client rfc 
INNER JOIN trucks t ON rfc.truck_id = t.id 
INNER JOIN users u ON rfc.driver_id = u.id 
INNER JOIN clients c ON rfc.client_id = c.id 
LEFT JOIN (
     SELECT 
      rfc.id 
     FROM ready_for_client rfc 
     INNER JOIN ready_to_ship rts ON rfc.rts_id = rts.rfc_id 
     WHERE rfc.is_done = 0 
    ) d ON rfc.rts_id = d.id 
WHERE d.id IS NULL 
; 

使用しないが、EXISTS存在します。その行を無視する場合、現在の行が他のテーブルに一致するかどうかを確認します。

​​
+0

パーフェクト、ありがとう。 LEFT JOINはまだready_for_client id 4(d21b5ac4a4da0e57b85a464c3a6fd511)を追加していました。しかし、あなたの2番目の例は存在しません。私はまたready_to_shipから選択して、それをもう一度試してみました。 –

関連する問題