Во-первых, вы должны исправить вашу модель данных. Хранение чисел 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
. Возможно ли иметь «заказ» без действительного «отеля»?