2012-01-12 3 views
0
category item 
red   pen 
red   ball 
blue  kite 
blue  toy 
shiny  pen 

Я хочу получить все элементы, которые являются красными ИЛИ синими, и они должны быть блестящими.mysql где заявление

Вот мой запрос до сих пор

SELECT DISTINCT item FROM mytable WHERE category IN ("red","blue") 

Получить все красные и синие предметы, но как я могу указать, что элемент должен также быть блестящими? Добавление блеска в инструкцию IN по-прежнему будет возвращать все синие элементы. Синие элементы должны быть исключены, поскольку ни одна из них не имеет блестящей записи в базе данных.

В моем примере нужно вернуть только ручку. Любая помощь будет очень высоко ценится.

+0

Если вы не решили это самостоятельно, проверьте мой ответ ниже для подсказок и решения :) – Tom

ответ

0

Вы должны сделать самостоятельно присоединиться к столу, но помните, что автообъединение очень медленно, когда размер таблицы получить увеличилось. Вы должны рассмотреть нормализацию своей таблицы.

1

Это должно работать:

select item from mytable where category = "red" or item = "blue" 
intersect 
select item from mytable where category = "shiny"; 

Первый выбор сделать набор всех красных или синих элементов, второй выбор сделать набор всех блестящих элементов. Поскольку вы хотите сохранить только тех, кто находится в двух наборах, вы просто сделали пересечение между двумя наборами.

http://sql.1keydata.com/fr/sql-intersect.php

1

Вы должны присоединиться таблицу к себе.

SELECT DISTINCT mytable1.item FROM mytable mytable1 
INNER JOIN mytable mytable2 ON mytable1.item=mytable2.item 
WHERE mytable1.category IN ("red","blue") AND mytable2.category="shiny" 
1
select 
     mt.item 
    from 
     MyTable mt 
    group by 
     mt.item 
    having 
      sum(if(mt.category = "shiny", 1, 0)) = 1 
     and sum(if(mt.category in ("red", "blue"), 1, 0)) > 0 
Смежные вопросы