@NewSantaClaus

Как сделать IN если возможные значения записаны строкой?

Есть таблица, назовем ее table_a
Она имеет две колонки
  • id - автоинкремент
  • keys - VARCHAR


Одна строка в этой таблице может иметь вид
id = 8
keys = 1,2,3,5,15

Есть еще одна таблица, назовем ее table_b
Из этой таблицы мне нужно получить записи у которых id соответствуют значению из поля keys в table_a

То есть, я делаю запрос
SELECT
	*
FROM
	table_b tb
WHERE
	id IN(SELECT ta.keys FROM table_a ta WHERE ta.id = 8)


По логике, вложенный запрос должен мне вернуть 1,2,3,5,15.
И конечный запрос приобрел бы вид
SELECT
	*
FROM
	table_b tb
WHERE
	id IN(1,2,3,5,15)


Но, где-то, что-то идет не так. Помоги плиз

Я подозреваю что все дело в том что на самом деле мне приходит строка "1,2,3,5,15" и это считается как одно из возможных значений в IN, но как это обойти, как сделать чтобы то был список возможных значений?
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 4
FanatPHP
@FanatPHP
Чебуратор тега РНР
В ужасе выкинуть таблицу, в которой поле может иметь вид 1,2,3,5,15 и потом еще полчаса тошнить в унитаз от омерзения.
Купить букварь по базам данных
Прочитать в нем такое слово как "реляционная база данных"
Сделать нормальную таблицу, в которой 1,2,3,5,15 будет не в одной строке, а в ПЯТИ
Дальше всё как и было
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега MySQL
SELECT 
    `table_b`.* 
FROM
    `table_b`
    JOIN `table_a` ON (FIND_IN_SET(`table_b`.`id`, `table_a`.`keys`) > 0)
WHERE
    `table_a`.`id`='8'


Хотя лучше, конечно, воспользоваться советом FanatPHP
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
SELECT table_b.id, table_b.name
  FROM table_b 
    INNER JOIN table_a ON CONCAT(',',table_a.keys,',') LIKE CONCAT('%,',table_b.id, ',%')
  WHERE (table_a.id = 8)
Ответ написан
Fernus
@Fernus
Техник - Механик :)
Решение задачи...но это ппц...
Тупо вариант, чтобы "размять" мозги :)

SELECT
  *
FROM
  table_b
WHERE
  id IN(SELECT
        DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(`keys`, ',', n.digit+1), ',', -1) val
      FROM
        table_a
        INNER JOIN
        (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
        ON LENGTH(REPLACE(`keys`, ',' , '')) <= LENGTH(`keys`)-n.digit
      WHERE `id` = 1
       );


Пример с данными
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы