Требуется запрос на соединение для данных

У меня есть таблицы ниже

А) 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

Если вы хотите объединить таблицы, скажем, product_free_issue и product_free_issue_detail, pfi_id 14966 должен присутствовать в обоих. Если ключи разные, то соединять их нет смысла

Alan Pallath 09.04.2018 11:46

Как-то вы перепутали идентификаторы в ваших пробных данных. Пожалуйста, проверьте pfd_pfi_id и pa_pfi_id. У вас там только 14966, но в вашем результате вы объединяете 14966 с 14988. Я не думаю, что это желательно.

Thorsten Kettner 09.04.2018 11:52

Более того: действительно ли вам нужны 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.

Thorsten Kettner 09.04.2018 12:02

Я отредактировал ваше сообщение, чтобы отображать запросы в виде кода, что делает его более читаемым, требуется еще один голос, чтобы повторно открыть ваше сообщение :)

Alon Eitan 09.04.2018 12:10

Это всего лишь пример моей таблицы, потому что в реальной таблице много столбцов. Да, мне также нужны pfd_id и pa_id. Да, в таблице есть много записей, таких как 14988, но я объясняю здесь для 14966 только для того, чтобы получить результат выше, например.

Rajeev Nath Verma 09.04.2018 12:17

Хорошо, вам нужно частичное перекрестное соединение pfd и pa. Это странное требование, но ничего страшного. Но ваша вторая строка результатов показывает pfi_id 14988 с pfd_pfi_id 14996 и pa_pfi_id 14996. По какому правилу они должны быть объединены? (Я все еще думаю, что есть опечатки.)

Thorsten Kettner 09.04.2018 12:40

Извините, я только что обновил свой код, проверьте сейчас.

Rajeev Nath Verma 09.04.2018 13:06

Хорошо. Не могли бы вы объяснить, почему вы присоединяетесь к pfd_id 30158 с pa_id 3421, а не с 3420? А почему вы присоединяете pfd_id 30157 к pa_id 3420, а не к 3421? Какое правило вы здесь применяете? Я не вижу связи одного конкретного pfd_id с одним pa_id (вот почему я подумал, что вы хотите перекрестное соединение и получить четыре вместо двух строк). Пожалуйста, объясни.

Thorsten Kettner 09.04.2018 13:53

Да, это настоящая проблема, некоторые предыдущие разработчики пропустили это соединение pfd_id в pa_id, у нас есть только один общий ключ pfi_id в обеих таблицах, поэтому нужна база данных на нем.

Rajeev Nath Verma 09.04.2018 15:04

Так вы думаете, что записи pfd и pa-записи должны быть связаны? product_free_issue_audit - это на самом деле аудит product_free_issue_detail, а не просто product_free_issue? Откуда вы знаете, что pa_id 3421 принадлежит pfd_id 30158, а не pfd_id 30157? Я понятия не имею, как вы устанавливаете эту связь.

Thorsten Kettner 09.04.2018 15:11
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
10
39
1

Ответы 1

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 записи.

Rajeev Nath Verma 09.04.2018 12:19

Другие вопросы по теме