У меня есть таблицы ниже
А) product_free_issue
pfi_id pfi_lo_id
14966 57
Б) product_free_issue_detail
pfd_id pfd_pfi_id pfd_pr_price
30158 14966 677.97
30157 14966 677.97
C) product_free_issue_audit
pa_id pa_pfi_id pa_issue_qty pa_missing_extra
3421 14966 2 +8
3420 14966 3 +7
Здесь первичный ключ pfi_id таблицы product_free_issue является внешним ключом в product_free_issue_detail и табели product_free_issue_audit
Нужен запрос на соединение, который воспроизводит такие данные, как -
pfi_id pfi_lo_id pfd_id pfd_pfi_id pfd_pr_price pa_id pa_pfi_id pa_issue_qty pa_missing_extra
14966 57 30158 14966 677.97 3421 14966 2 +8
14966 57 30157 14966 677.97 3420 14966 3 +7
Я пробовал этот запрос (1)
SELECT pfi.*,pfd.*,pa.*
FROM (`product_free_issue` as pfi)
INNER JOIN `product_free_issue_detail` as pfd ON `pfd`.`pfd_pfi_id` = `pfi`.`pfi_id`
INNER JOIN `product_free_issue_audit` as pa ON `pa_pfi_id` = `pfi`.`pfi_id`
WHERE
`pa`.`pa_lo_id` = '57'
GROUP BY `pfd_id`
Они возвращают такие данные, как
pfi_id pfi_lo_id pfd_id pfd_pfi_id pfd_pr_price pa_id pa_pfi_id pa_issue_qty pa_missing_extra
14996 57 30157 14996 677.97 3420 14996 3 +7
14996 57 30158 14996 677.97 3420 14996 3 +7
и этот (2)
SELECT pfi.*,pfd.*,pa.*
FROM (`product_free_issue` as pfi)
INNER JOIN `product_free_issue_detail` as pfd ON `pfd`.`pfd_pfi_id` = `pfi`.`pfi_id`
INNER JOIN `product_free_issue_audit` as pa ON `pa_pfi_id` = `pfi`.`pfi_id`
WHERE
`pa`.`pa_lo_id` = '57'
GROUP BY `pa_id`
Затем возвращает такие данные, как
pfi_id pfi_lo_id pfd_id pfd_pfi_id pfd_pr_price pa_id pa_pfi_id pa_issue_qty pa_missing_extra
14996 57 30157 14996 677.97 3420 14996 3 +7
14996 57 30157 14996 677.97 3421 14996 2 +8
Как-то вы перепутали идентификаторы в ваших пробных данных. Пожалуйста, проверьте pfd_pfi_id и pa_pfi_id. У вас там только 14966, но в вашем результате вы объединяете 14966 с 14988. Я не думаю, что это желательно.
Более того: действительно ли вам нужны pfd_id и pa_id в ваших результатах? Кажется, они не связаны напрямую. Если pfi_id 14999 имеет два pfd_id 1 и 2 и два pa_id 3 и 4, то вы уже получите четыре строки результатов: 14999/1/3, 14999/1/4, 14999/2/3, 14999/2. / 4.
Я отредактировал ваше сообщение, чтобы отображать запросы в виде кода, что делает его более читаемым, требуется еще один голос, чтобы повторно открыть ваше сообщение :)
Это всего лишь пример моей таблицы, потому что в реальной таблице много столбцов. Да, мне также нужны pfd_id и pa_id. Да, в таблице есть много записей, таких как 14988, но я объясняю здесь для 14966 только для того, чтобы получить результат выше, например.
Хорошо, вам нужно частичное перекрестное соединение pfd и pa. Это странное требование, но ничего страшного. Но ваша вторая строка результатов показывает pfi_id 14988 с pfd_pfi_id 14996 и pa_pfi_id 14996. По какому правилу они должны быть объединены? (Я все еще думаю, что есть опечатки.)
Извините, я только что обновил свой код, проверьте сейчас.
Хорошо. Не могли бы вы объяснить, почему вы присоединяетесь к pfd_id 30158 с pa_id 3421, а не с 3420? А почему вы присоединяете pfd_id 30157 к pa_id 3420, а не к 3421? Какое правило вы здесь применяете? Я не вижу связи одного конкретного pfd_id с одним pa_id (вот почему я подумал, что вы хотите перекрестное соединение и получить четыре вместо двух строк). Пожалуйста, объясни.
Да, это настоящая проблема, некоторые предыдущие разработчики пропустили это соединение pfd_id в pa_id, у нас есть только один общий ключ pfi_id в обеих таблицах, поэтому нужна база данных на нем.
Так вы думаете, что записи pfd и pa-записи должны быть связаны? product_free_issue_audit - это на самом деле аудит product_free_issue_detail, а не просто product_free_issue? Откуда вы знаете, что pa_id 3421 принадлежит pfd_id 30158, а не pfd_id 30157? Я понятия не имею, как вы устанавливаете эту связь.






SELECT pfi.pfi_id,
pfi.pfi_lo_id,
pfid.pfd_id,
pfid.pfd_pfi_id,
pfid.pfd_pr_price,
pfia.pa_id,
pfia.pa_pfi_id,
pfia.pa_issue_qty,
pfia.pa_missing_extra
FROM product_free_issue pfi
INNER JOIN product_free_issue_detail pfid
ON pfi.pfi_id=pfid.pfd_pfi_id
INNER JOIN product_free_issue_audit pfia
ON pfi.pfi_id=pfia.pa_pfi_id
Это возвращает 4 записи, повторяющие данные несколько раз. Но для примера выше мне нужны только 2 записи.
Если вы хотите объединить таблицы, скажем, product_free_issue и product_free_issue_detail, pfi_id 14966 должен присутствовать в обоих. Если ключи разные, то соединять их нет смысла