我正在开发一个库存php/mysql应用程序。
我有一个主表(inv_main),它将容纳equipmentID和实际持有此设备的userID。然后,我有一个设备表(inv_equip),其中包含有关设备的信息以及谁订购了产品,以及为谁订购的信息,这两个信息都链接到用户it。
我正在尝试返回equipmentID、ownerName、orderedByName、orderedForName
当我运行下面的查询时,我得到了orderedByName和OrderedForName的null,这两个字段都应该返回名称,因为这些字段都有ID并且不是null。
SELECT inv_equip.tech_id, inv_user.user_lname as ownedByName,
orderFor.user_lname as orderForName, orderFrom.user_lname as orderFromName
FROM inv_main
LEFT JOIN inv_equip ON inv_main.main_equip_id = inv_equip.equip_id
LEFT JOIN inv_user ON inv_main.main_user_id = inv_user.user_id
LEFT JOIN inv_user as orderFor ON inv_equip.equip_ordered_for = inv_user.user_id
LEFT JOIN inv_user as orderFrom ON inv_equip.equip_ordered_from = inv_user.user_id
WHERE (inv_main.main_equip_id = 26)
这就是我的输出结果
tech_id ownedByName orderForName orderFromName
TCH20110305_1299355914 admin NULL NULL
现在,如果我运行这个查询,我将再次获得正确的ownedByname,但返回的orderForName是我在user表中为每个用户记录的。不同的是,我没有指定返回某个id,而是全部在db中返回。
SELECT inv_equip.tech_id, inv_user.user_lname AS ownedByName,
orderFor.user_lname AS orderForName, orderFrom.user_lname AS orderFromName
FROM inv_main
LEFT JOIN inv_equip ON inv_main.main_equip_id = inv_equip.equip_id
LEFT JOIN inv_user ON inv_main.main_user_id = inv_user.user_id
LEFT JOIN inv_user AS orderFor ON inv_equip.equip_ordered_for = inv_user.user_id
LEFT JOIN inv_user AS orderFrom ON inv_equip.equip_ordered_from = inv_user.user_id
我得到了以下结果
OwnedBy OrderedFor OrderedBy
TCH20110304_1299257155 hucker admin NULL
TCH20110304_1299257155 hucker hucker NULL
TCH20110304_1299257155 hucker beatty NULL
TCH20110304_1299257155 hucker Frank2 NULL
TCH20110304_1299257245 beatty admin admin
TCH20110304_1299257245 beatty admin hucker
TCH20110304_1299257245 beatty admin beatty
在哪里,因为我正在寻找一个sql查询,它会导致
itemID OwnedBy OrderedFor OrderedBy
x Hucker Beatty Frank
关于如何纠正我的连接逻辑以返回只有一条记录的受人尊敬的userID的名称,有什么建议吗?
发布于 2011-03-06 17:12:24
您的第二个和第三个联接针对第一个联接指定了一个on
条件:
LEFT JOIN inv_user
ON inv_main.main_user_id = inv_user.user_id
LEFT JOIN inv_user as orderFor
ON inv_equip.equip_ordered_for = inv_user.user_id
LEFT JOIN inv_user as orderFrom
ON inv_equip.equip_ordered_from = inv_user.user_id
尝试修改代码,使每个连接都使用它自己的表:
LEFT JOIN inv_user
ON inv_main.main_user_id = inv_user.user_id
LEFT JOIN inv_user as orderFor
ON inv_equip.equip_ordered_for = **orderFor**.user_id
LEFT JOIN inv_user as orderFrom
ON inv_equip.equip_ordered_from = **orderFrom**.user_id
**
只是为了强调。
发布于 2011-03-06 17:12:39
您在连接条件上有错误的别名,因为您每次都有INV_USER表引用...每个联接都需要其相应的别名。你让他们都指向了INV_USER别名。
SELECT
inv_equip.tech_id,
inv_user.user_lname as ownedByName,
orderFor.user_lname as orderForName,
orderFrom.user_lname as orderFromName
FROM
inv_main
LEFT JOIN inv_equip
ON inv_main.main_equip_id = inv_equip.equip_id
LEFT JOIN inv_user
ON inv_main.main_user_id = inv_user.user_id
LEFT JOIN inv_user as orderFor
ON inv_equip.equip_ordered_for = orderFor.user_id
LEFT JOIN inv_user as orderFrom
ON inv_equip.equip_ordered_from = orderFrom.user_id
WHERE
inv_main.main_equip_id = 26
https://stackoverflow.com/questions/5211962
复制