Объединение данных в двух таблицах SQL - PullRequest
0 голосов
/ 19 ноября 2018

Я уверен, что это очень простой вопрос, но я продолжаю застревать:

Table A - image_number, camera_type, total_sales
Table B - image_number, keyword

Таблица A имеет одну строку для каждого image_number - пример:

image_number="AXJ789, camera_type="Nikon", total_sales=678
image_number="JIJ123", camera_type="Canon", total_sales=999
image_number="KNI908", camera_type="Sony", total_sales=565

Таблица B имеет много строк для каждого image_number - пример:

image_number="AXJ789", keyword = "rain"
image_number="AXJ789", keyword = "mountain"
image_number="AXJ789", keyword = "grass"
image_number="AXJ789", keyword = "cloud"

Я пытаюсь присоединиться к двум таблицам, чтобы получить следующий вывод:

image_number = "AXJ789", camera_type = 678, camera_type = "Nikon", ключевое слово (1) = "дождь", ключевое слово (2) = "гора", ключевое слово (3) = "трава", ключевое слово (4) = "облако"

Другими словами, я хочу, чтобы все элементы в каждой строке в таблице A + все элементы из таблицы B. Для каждого image_number в таблице A не может быть «ключевых слов» в таблице B или 50 ключевых слов - зависит от изображения.

Когда я делаю ВНУТРЕННЕЕ СОЕДИНЕНИЕ, конечно, я могу получить одно «ключевое слово» из таблицы B, но я не могу понять, как получить их все.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы можете создать список ключевых слов, разделенных запятыми, для каждого изображения, используя GROUP_CONCAT и JOIN (но используйте LEFT JOIN, если изображение не имеет ключевых слов).

SELECT a.*, GROUP_CONCAT(b.keyword) AS keyword_list
FROM a
JOIN b on b.image_number = a.image_number
GROUP BY a.image_number

Вывод данных для образца:

image_number    camera_type     total_sales     keyword_list
AXJ789          Nikon           678             rain,mountain,grass,cloud

Демонстрация по dbfiddle

Затем вы можете разобрать это в массив в вашем приложении, например, в PHP (если вы прочитали строку в $row):

$keywords = explode(',', $row['keyword_list']);
print_r($keywords);

Выход:

Array
(
    [0] => rain
    [1] => mountain
    [2] => grass
    [3] => cloud
)
0 голосов
/ 19 ноября 2018

Вы можете объединить ключевые слова вместе:

select a.*,
       (select group_concat(b.keyword)
        from b
        where b.image_number = a. image_number
       ) as keywords
from a;

Это создает список ключевых слов с разделителями-запятыми.Это намного проще (в MySQL), чем пытаться поместить их в отдельные столбцы.На самом деле, если вам нужны отдельные столбцы, я мог бы предложить проанализировать этот результат:

select a.*,  -- or whatever columns you want
       substring_index(keywords, ',' 1) as keyword1,
       substring_index(substring_index(keywords, ',' 2), ',', -1) as keyword2,
       substring_index(substring_index(keywords, ',' 3), ',', -1) as keyword3,
       substring_index(substring_index(keywords, ',' 4), ',', -1) as keyword4
from a left join 
     (select b.image_number, group_concat(b.keyword) as keywords
      from b
      group by b.image_number
     ) b
     on b.image_number = a. image_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...