MySQL ПРИСОЕДИНЯЙТЕСЬ к 2 ряду - PullRequest
0 голосов
/ 22 марта 2020

У меня есть следующие таблицы:

Костюмы

| id | hotel_id |   name   |  etc ...
  1        3      Some name
  2        3      SomeName2

Заказы

| id | suits | etc ...
   1    1,2    

Я хочу получить список заказов из базы данных с именами костюмов, как показано ниже:

| id | hotel_id |        suits       | etc ...
   1      3      Some name, SomeName2

Я пытаюсь с этим кодом:

            SELECT
            o.id,
            h.name as hotel,
            o.hotel as hotel_id,
            s.name
            FROM h_orders o
            LEFT JOIN hotels h ON o.hotel = h.id
            LEFT JOIN suits s ON o.suits = s.id
            WHERE o.user_id = ? GROUP BY o.id ORDER BY o.id DESC

Но получаю только первое имя масти. Как я могу получить результат, как указано выше? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Во-первых, вы должны исправить вашу модель данных. Хранение чисел c идентификаторов в столбце некорректно по многим причинам:

  • Числа не должны храниться в виде строк.
  • Строки не должны использоваться для хранения нескольких значений.
  • У идентификаторов должны быть правильно объявленные отношения внешних ключей.
  • SQL имеет плохую функциональность обработки строк.
  • SQL имеет отличный способ хранить списки. Она называется таблица , а не столбец .

Иногда мы застряли с действительно, действительно, очень плохими решениями других людей. Если это так, вы можете делать то, что вы хотите, используя find_in_set().

Поскольку вы используете left join s, я предполагаю, что вам нужны все строки, даже если нет совпадения. Это предполагает:

SELECT o.id, o.hotel as hotel_id, GROUP_COCNAT(s.name SEPARTOR ', ') as suits
FROM h_orders o LEFT JOIN
     hotels h
     ON o.hotel = h.id LEFT JOIN
     suits s
     ON FIND_IN_SET(s.id, o.suits) > 0
WHERE o.user_id = ?
GROUP BY o.id, o.hotel
ORDER BY o.id DESC;

Однако вы должны сосредоточиться на исправлении модели данных.

Кроме того, не ясно, почему у вас будет LEFT JOIN от orders до hotels. Возможно ли иметь «заказ» без действительного «отеля»?

1 голос
/ 22 марта 2020

Вы можете сделать это с помощью функции FIND_IN_SET():

SELECT 
  o.id,
  h.name as hotel,
  h.id as hotel_id,
  group_concat(s.name) as suits
FROM h_orders o 
LEFT JOIN suits s ON o.suits = s.id
LEFT JOIN hotels h ON o.hotel = h.id
WHERE o.user_id = ? AND FIND_IN_SET(s.id, o.suits)
GROUP BY o.id, h.name, h.id 
ORDER BY o.id DESC

Я сохранил условие o.user_id = ? в запросе, хотя вы не объяснили, для чего оно нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...