Php Mysql查询两个表连接条件

Php Mysql查询两个表连接条件,php,mysql,Php,Mysql,我有两张桌子,准备给客户,准备出货。两个表的结构几乎相同 id (int) client_id (int) truck_id (int) driver_id (int) list (varchar 50) is_done (tinyint 1) ready_for_客户端具有rts_id varchar 32,ready_to ship具有rfc_id varchar 32 我想要的是三个不同的查询,第一个查询rts_id和rfc_id相同的两个

我有两张桌子,准备给客户,准备出货。两个表的结构几乎相同

    id (int)
    client_id (int)
    truck_id (int)
    driver_id (int)
    list (varchar 50)
    is_done (tinyint 1)
ready_for_客户端具有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
这将生成一条与它应该生成的记录一样的记录。在第二个和第三个查询中,我想分别为两个表选择不共享rfc_id和rts_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
但这是记录的两倍,还包括一个具有共享rts_id和rfc_id的记录

有人知道我将如何设置第二个和第三个查询来执行我需要的操作吗

-编辑-

为客户准备好了吗

    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+
    | 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 |
    +----+-----------+----------+-----------+---------------------------+----------------------------------+---------+
准备好上船了吗

    +----+-----------+----------+-----------+-------+----------------------------------+---------+
    | 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 |
    +----+-----------+----------+-----------+-------+----------------------------------+---------+
第二个查询的输出,尝试从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          |
    +---------------------+----------------------------------+--------------+------------+----------------------+

它应仅用于读取客户端id 1 2和3的。没有id 4,也没有12和3的加倍。

您希望定位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
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
;
使用不存在。确定当前行是否在另一个表中有匹配项(如果忽略该行)

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
WHERE rfc.is_done = 0
AND NOT EXISTS (
      SELECT NULL
      FROM ready_to_ship rts 
      WHERE rfc.rts_id = rts.rfc_id
      ) 
;

如果可以的话,请想象一下,我要求您为您从未见过的表生成3个查询。。。。始终以可重用文本或sql插入的形式提供示例数据和预期结果,因为这样可以快速获得准确答案。您可以使用where条件,如where rfc.rts_id!=rts.rfc_id可能会为您提供解决方案,对不起,我甚至没有想到这一点。我已经添加了一些数据和第二次查询的结果。非常好,谢谢。左侧联接仍在添加ready_for_客户端id 4 d21b5ac4a4da0e57b85a464c3a6fd511。但是你的第二个例子并不存在,它是有效的。我也尝试过另一种方法,从ready_到ship进行选择,效果很好!