Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Подкскажите как сделать запрос


Автор: Рыжий 11.5.2009, 12:30
Здравствуйте!
Никак не могу прийти к решению:

Есть такая таблица:
+---+---------+------+
| 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, но так и не удалось его применить нормально.

Что подскажите?

Автор: skyboy 11.5.2009, 15:35
Код

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 */


Автор: Рыжий 11.5.2009, 19:28
skyboy,  smile Ого, Спасибо!

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

Но код классный, позабыл я об INNER JOIN smile 

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

не понял, откуда тут left join возьмется. покажи пример.

Автор: primesite 19.5.2009, 23:19
Как вариант (не проверено):

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

Автор: Akina 20.5.2009, 07:58
Цитата(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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)