powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование ( WHERE id IN () )
11 сообщений из 11, страница 1 из 1
Использование ( WHERE id IN () )
    #38622851
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Имеется такой запрос:
Код: sql
1.
SELECT * FROM users WHERE id IN (SELECT discount_ids FROM discounts WHERE id=65)



Таблица discounts:
id - PRIMARY KEY = 65
discount_ids - VARCHAR(9) = "1,2,3,4,5"

В чем проблема: поле discount_ids - это просто текст, уже содержащий цифры через запятую.

Т.е. подзапрос вернет только одну строку "1,2,3,4,5", но не список строк! Почему-то основной запрос (SELECT * FROM users WHERE id IN) делает выборку только по первой цифре (возможно MySQL преобразует полученные строки в INTEGER?). А как можно получить все 5 строк? Можно ли сделать такую выборку одним запросом?
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622870
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, но это изврат.
Код: sql
1.
SELECT * FROM users WHERE CONCAT (',',(SELECT discount_ids FROM discounts WHERE id=65),',') LIKE CONCAT('%,',id,',%')

Код: sql
1.
SELECT * FROM users WHERE FIND_IN_SET(id,(SELECT discount_ids FROM discounts WHERE id=65))>0


В любом случае забудьте про индексы и быстродействие.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622897
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

да, спасибо FIND_IN_SET сработал!
Код: sql
1.
В любом случае забудьте про индексы и быстродействие.


Но и WHERE id IN() с подзапросом тоже обходит всю таблицу users...
Наверное лучше сделаю 2 запроса - WHERE id IN(1,2,3,4,5) на прямую использует индексы на ура.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622899
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот хранили бы данные правильно - был бы и один запрос, и быстро.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622910
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
авторА вот хранили бы данные правильно - был бы и один запрос, и быстро.
Дык, выходит не рационально как-то.
Тут один юзер - одина строка. А так на каждого юзера - 5 строк в бд нужно бы.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622951
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moonА так на каждого юзера - 5 строк в бд нужно бы.Вот это как раз правильно.

Хорошо еще, что у вас ситуация еще довольно простая. А более сложных запросах такое разделение на две части может быть либо невозможно, либо очень затруднительно.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622957
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e_moon,
Добрый день.
Как бы Mysql - это РСУБД, поэтому так и хранят. Это вам не NoSQL хранилища.
Что-то такая тема уже раз 2 или 3 всплывает.
Примеры:
http://www.sql.ru/forum/1090503/svyazi-kluchi-metody-hraneniya
http://www.sql.ru/forum/1090379/proverka-peresecheniya-dvuh-mnozhestv-na-letu

С уважением,
biwed.ru
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622984
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы.

Но что меня смущает: в таблице кроме двух нужных в данном запросе полей - еще куча.

Вот структура таблицы:
id | discount_ids | amount | date_start | date_end

Сейчас строки такие:

65 | 1,2,3,4,5 | 100 | 2014-05-01 | 2014-05-31

А получается нужно так?!

1 | 65 | 5 | 100 | 2014-05-01 | 2014-05-31
2 | 65 | 4 | 100 | 2014-05-01 | 2014-05-31
3 | 65 | 3 | 100 | 2014-05-01 | 2014-05-31
4 | 65 | 2 | 100 | 2014-05-01 | 2014-05-31
5 | 65 | 1 | 100 | 2014-05-01 | 2014-05-31

Выходит выбор между "физический размер VS скорость работы"?
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38622998
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moonА получается нужно так?!Нет, связь нужно выносить в отдельную таблицу.
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38623018
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
biwed.ruЧто-то такая тема уже раз 2 или 3 всплывает.она тут постоянно всплывает, привыкайте :)
...
Рейтинг: 0 / 0
Использование ( WHERE id IN () )
    #38623176
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e_moon,
Добрый день.
e_moon1 | 65 | 5 | 100 | 2014-05-01 | 2014-05-31
2 | 65 | 4 | 100 | 2014-05-01 | 2014-05-31
3 | 65 | 3 | 100 | 2014-05-01 | 2014-05-31
4 | 65 | 2 | 100 | 2014-05-01 | 2014-05-31
5 | 65 | 1 | 100 | 2014-05-01 | 2014-05-31
Так это же измерение Ральфа Кимбалла второго типа. Лучше почитайте http://en.wikipedia.org/wiki/Slowly_changing_dimension
Основное предназначение использовать при проектировании Data Ware House.

С уважением,
biwed.ru
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование ( WHERE id IN () )
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]