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进行选择,效果很好!