Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подкскажите как сделать запрос 
V
    Опции темы
Рыжий
Дата 11.5.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



Здравствуйте!
Никак не могу прийти к решению:

Есть такая таблица:
+---+---------+------+
| id |   field   | item |
+---+---------+------+
|  0 |   one   |    1   |
|  1 |   two   |    2   |
|  2 |   two   |    1   |
|  3 |   one   |    3   |
+__+_____+____+

id - auto_increment, primary_key
field - поле varchar, которое может принимать разные значения (допустим это one, two, three...)
item - через это поле есть связь с другими таблицами, это как itemid

Вопрос:
Как мне выбрать только те item, у которых field есть one и two (то есть те, что выделены синим), если только один one - не подходит, если только один two - тоже. Нужно, чтобы одновременно one и two.

Я уже совсем запутался... вроде как при одном SELECT запрос обрабатывает только одну строку и сравнивать с предыдущими результатами не может. Думал насчет GROUP BY, но так и не удалось его применить нормально.

Что подскажите?
PM MAIL ICQ   Вверх
skyboy
Дата 11.5.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Код

SELECT t0.item
FROM t as t0
INNER JOIN t as t1
ON t0.item = t1.item
WHERE t0.field = 'one' AND t1.field = 'two'

или(не проверено)
Код

SELECT item
FROM t
GROUP BY item
HAVING group_concat(field order by field) = "one,two"
/*если в поле field может быть не только "one" и "two", 
то надо будет использовать locate */


PM MAIL   Вверх
Рыжий
Дата 11.5.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Регистрация: 19.9.2004

Репутация: нет
Всего: 20



skyboy,  smile Ого, Спасибо!

Жаль только, что нагрузку на сервер прибавляет значительно. Кроме 'one', 'two' может быть еще 20 других вариантов и собственно этот код еще вклинивается в запрос с LEFT JOIN`ами и WHERE. Да и в БД 140 000 записей и без того, - огого :( 

Но код классный, позабыл я об INNER JOIN smile 
PM MAIL ICQ   Вверх
skyboy
Дата 12.5.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Рыжий @  11.5.2009,  18:28 Найти цитируемый пост)
Кроме 'one', 'two' может быть еще 20 других вариантов и собственно этот код еще вклинивается в запрос с LEFT JOIN`ами и WHERE

не понял, откуда тут left join возьмется. покажи пример.
PM MAIL   Вверх
primesite
Дата 19.5.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.5.2009

Репутация: нет
Всего: нет



Как вариант (не проверено):

SELECT item, COUNT(DISTINCT field) as unique_count
FROM table
GROUP BY item
HAVING unique_count > 1;

PM MAIL WWW   Вверх
Akina
Дата 20.5.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(primesite @  20.5.2009,  00:19 Найти цитируемый пост)
Как вариант (не проверено):

Нормальный вариант - при условии что все возможные варианты field должны быть в наличии (есссно заменить >1 на =N, где N - количество вариантов). Если же нужно отобрать определённый набор из возможных вариантов, то добавляется ещё условие отбора, типа (даю для трёх требуемых из более чем трёх возможных)

Код

SELECT item, COUNT(DISTINCT field) as unique_count
FROM table
GROUP BY item
WHERE field IN ('one', 'two', 'three')
HAVING unique_count = 3;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.