PHP / MYSQL: Left Join не получает правильные родительские данные

SELECT smirt.id as mid,
pc.packet_name as pname,
pcs.packet_name as mainn,
smirt.p_status as st ,
smirt.new_value as weight ,
smirt.packet_id,
smirt.parent_packet_id
FROM issue_receive_process AS smirt
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2)
ORDER BY smirt.packet_id

Из вышеприведенного запроса я получаю ниже детали:

Из вышеприведенного запроса я получаю то, чего не хочу

Но выше неправильно

Как pname мой подпакет
и mainn это мой главный пакет

На самом деле мне нужно (должно быть) pname (NULL, 0004) И mainn (0003,0002), как показано ниже (ниже изображение является редактировать изображение):

правильный запрос

так как 0003, 0002 — основной пакет, а 0004 — подпакет 0002 … 0003 не имеет никакого подпакета ….

Может ли помочь мне, где я не прав.

Спасибо

ОБНОВИТЬ : PARENT TABLE IMAGE thats (issue_receive_process AS smirt)

РОДИТЕЛИ

КАК ПОЛЬЗОВАТЕЛЬ: KISHORE НИЖЕ QUERY:

SELECT smirt.id
,smirt.packet_id
,smirt.main_kapan_id
,pc.id
,pc.packet_name
,pc.parent_packet_id
FROM issue_receive_process AS smirt
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
WHERE pc.packet_name IN ('0002','0003','0004')
ORDER BY smirt.packet_id

НИЖЕ РЕЗУЛЬТАТ:

РЕЗУЛЬТАТ

Второе обновление таблицы: Пакет_создание ниже деталей, как показано ниже запроса

SELECT *
FROM `packet_creation`
WHERE `id`
IN ( 5, 11, 9 )
LIMIT 0 , 30

введите описание изображения здесь

-3

Решение

Я очень смущен тем, что вы хотите.

Ваш SQL даст данные, которые вы описываете как неправильные при запуске с вашими тестовыми данными. Он получает запись и пакет с этим, а затем этот родительский пакет. Если у пакета нет родителя, то возвращается (и должен быть) NULL.

Единственное, что я могу подумать, что вы хотите, это то, что если родительской записи нет, вы хотите, чтобы идентификатор дочернего пакета возвращался как идентификатор родительского пакета, а дочерний — как NULL.

Если так, то вот так:

SELECT smirt.id as mid,
IF(pcs.packet_name IS NULL, NULL, pc.packet_name) as pname,
IF(pcs.packet_name IS NULL, pc.packet_name, pcs.packet_name) as mainn,
smirt.p_status as st ,
smirt.new_value as weight ,
smirt.packet_id,
smirt.parent_packet_id
FROM issue_receive_process AS smirt
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2)
ORDER BY smirt.packet_id

КАК ВЫШЕ ВЫШЕ КРАТКИЙ РЕЗУЛЬТАТ НИЖЕ:

введите описание изображения здесь

ПОЧЕМУ ЗАКЛЮЧИТЕЛЬНЫЙ РЕЗУЛЬТАТ Я ПОЛУЧИЛ, НО ЕГО ПРИХОДИТ КАК 3,4,2, но должно быть 0003,0002,0004

введите описание изображения здесь

РЕДАКТИРОВАТЬ — приведение полей к типу char, чтобы попытаться заставить ведущие нули: —

SELECT smirt.id as mid,
IF(pcs.packet_name IS NULL, NULL, CAST(pc.packet_name AS CHAR)) as pname,
IF(pcs.packet_name IS NULL, CAST(pc.packet_name AS CHAR), CAST(pcs.packet_name AS CHAR)) as mainn,
smirt.p_status as st ,
smirt.new_value as weight ,
smirt.packet_id,
smirt.parent_packet_id
FROM issue_receive_process AS smirt
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2)
ORDER BY smirt.packet_id
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]