ВЫБЕРИТЕ ПРИСОЕДИНЯЙТЕСЬ К MYSQL - PullRequest
0 голосов

У меня есть 2 таблицы, которые user и userdata.

Как только клиент купит продукт, он вставит в таблицу userdata и user.

Inuser таблица, идентификатор продукта записывается в user. buyid в форме «id, id, id, id, id».

пример: «23, 24».Поэтому я попытался получить все строки с идентификатором (23, 24) из продукта, используя эти запросы

SELECT * FROM `userdata`,`user` WHERE `userdata`.`id` IN (`user`.`buyid`);

Запрос возврата 1 строки продукта с id = 23

SELECT * FROM `user` INNER JOIN `userdata` ON `userdata`.`id` IN (`user`.`buyid`);

Thisтоже вернуть только 1 строку продукта с идентификатором 23.

Ожидаемый результат, каждая строка возвращает это:

user.id | user.name | user.contact | product.id | product.name
1       | nazmi     | 99999        | 23         | A
1       | nazmi     | 99999        | 24         | B

1 Ответ

0 голосов
/ 17 мая 2018

Исправьте вашу модель данных!Хранить списки идентификаторов в строке плохо, плохо, плохо:

  • Ваш идентификатор является целым числом.Он должен храниться в виде числа, а не строки.
  • Ваш идентификатор относится к другой таблице.В нем должны быть правильно объявлены отношения внешнего ключа.
  • Столбец должен содержать один столбец.
  • SQL имеет отличный способ хранения списков.Действительно мощный.Он называется «таблица», а не «строковый столбец».
  • Возможности обработки строк в SQL довольно плохие.
  • Запросы с такими структурами данных не могут использовать преимущества индексов и секционирования.

Иногда вы застряли с очень-очень плохими решениями других людей.MySQL предлагает полезную функцию (на мой взгляд, слишком приятную), чтобы помочь:

SELECT *
FROM user u JOIN
     userdata ud
     ON find_in_set(ud.id, u.buyid) > 0;

Если в вашем списке идентификаторов есть пробелы, вам нужно от них избавиться.И разделитель должен быть запятой.

SELECT *
FROM user u JOIN
     userdata ud
     ON find_in_set(ud.id, replace(u.buyid, ' ', '')) > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...