Проблема с соединением SQL и результатами - PullRequest
0 голосов
/ 06 марта 2011

Я работаю над приложением php / mysql для инвентаризации.

У меня есть основная таблица (inv_main), в которой будут находиться ID оборудования и ID пользователя, который на самом деле содержит это оборудование.Затем у меня есть таблица оборудования (inv_equip), в которой хранится информация об оборудовании, а также о том, кто заказал продукт и для кого он был заказан, и обе ссылки связаны с идентификаторами пользователей.

Я пытаюсь вернутьрезультат equipmentID, ownerName, orderByName, ordersForName

Когда я запускаю следующий запрос, я получаю значения NULL для orderByName и OrderedForName, которые оба должны возвращать имена, поскольку эти поля имеют идентификаторы и не равны нулю.

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

Теперь, если я выполняю этот запрос, я снова получаю правильное значение ownByname, но orderForName возвращает запись i для каждого пользователя в моей таблице пользователей.Разница в том, что я не указываю, чтобы вернуть определенный идентификатор, но все в БД.

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 только с одной записью?

Ответы [ 2 ]

1 голос
/ 06 марта 2011

У вас был неверный псевдоним в условии соединения ON, так как вы каждый раз имели ссылку на таблицу INV_USER ... каждому JOIN требуется соответствующий Псевдоним. вы все указали на 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
0 голосов
/ 06 марта 2011

Ваши 2-е и 3-е объединения указывают условие on против 1-го объединения:

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 

** только для акцента.

...