Как запустить SQL-запрос, где имена coumn_name имеют значения, разделенные запятыми? - PullRequest
0 голосов
/ 13 июня 2018
CustomerID  cat_id  ContactName  Address    City    PostalCode  Country
1   Alfreds 13      Maria Anders Obere Str  Berlin  12209   Germany
4   Around  13,14   Thomas Hardy 120 Hanov  London  WA1 1DP UK

что такое запрос для получения 14 данных?Я пытался

SELECT * 
FROM `customers` 
WHERE cat_id IN (13,14) 

, но не смог.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Исправьте вашу модель данных!Почему это неправильно?

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

Итак, у вас должна быть таблица с одной строкой на customer_id и cat_id.Это часто называют «соединительной таблицей» или «таблицей связей».

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

where find_in_set(13, cat_ids) > 0 and  -- or is that "or"
      find_in_set(14, cat_ids) > 0
0 голосов
/ 13 июня 2018

Примерно так должно работать:

ВЫБРАТЬ * ОТ $ tbls, ГДЕ КОНКАТ (',', cat_id, ',') LIKE '%, 14,%';

Хотя выследует рассмотреть вопрос о его нормализации.

0 голосов
/ 13 июня 2018

Вы можете использовать FIND_IN_SET:

SELECT * 
FROM `customers` 
WHERE FIND_IN_SET(13, `cat_id`) > 0 OR FIND_IN_SET(14, `cat_id`) > 0

Примечание: Вы не должны хранить такое значение!


Вместо этого ваши таблицы должны выглядеть следующим образом, чтобы избежать решения, использующего FIND_IN_SET:

table customers:

CustomerID | ContactName  | Address   | City   | PostalCode | Country
         1 | Maria Anders | Obere Str | Berlin | 12209      | Germany
         4 | Thomas Hardy | 120 Hanov | London | WA1 1DP    | UK 

table customers_cats:

customer_id | cat_id
          1 | 13
          4 | 13
          4 | 14

таблица cats:

CatID | Column1
---------------
   13 | abc
   14 | def

Таким образом, запрос будет выглядеть следующим образом:

SELECT c.* 
FROM `customers` c LEFT JOIN `customers_cats` cc ON c.CustomerID = cc.customer_id 
WHERE cc.cat_id IN (13, 14)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...