Многостраничное предложение MySQL

У меня есть таблица вроде этого:

id  image_id  style_id  style_value
-----------------------------------
1   45        24        red
1   45        25        big
1   47        26        small
1   45        27        round
1   49        28        rect

Я хочу взять столбец image_id, если:

  • style_id = 24 и style_value = red
  • style_id = 25 и style_value = big
  • style_id = 26 и style_value = round

Я делаю запрос следующим образом:

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') AND (style_id = 25 AND style_value = 'big') AND (style_id = 27 AND style_value = 'round')

Но я не мог получить никакого результата. Когда я делаю этот образец с OR, он работает хорошо. Но я должен сделать это с помощью AND. Потому что мне нужны идентификаторы изображений, которые являются "красными, большими и прямыми".

Я сделал много поисков с Google, но не смог исправить какое-либо решение.

Благодаря,

Хорошей работы.

Ответ 1

Я думаю, что вы после этого:

SELECT image_id
FROM list
WHERE (style_id, style_value) IN ((24,'red'),(25,'big'),(27,'round'))
GROUP BY image_id
HAVING count(distinct style_id, style_value)=3

Вы не можете использовать AND, потому что значения не могут быть 24 red и 25 big и 27 round одновременно в одной и той же строке, но вам нужно проверить наличие style_id, style_value в нескольких строках под одним и тем же image_id.

В этом запросе я использую IN (что в данном конкретном примере эквивалентно OR), и я подсчитываю различные строки, которые соответствуют. Если 3 различных строки совпадают, это означает, что для этого image_id присутствуют все 3 атрибута, и мой запрос вернет его.

Ответ 2

SELECT a.image_id 
FROM list a
INNER JOIN list b
   ON a.image_id = b.image_id
   AND b.style_id = 25
   AND b.style_value = 'big'
INNER JOIN list c
   ON a.image_id = c.image_id
   AND c.style_id = 27
   AND c.style_value = 'round'
WHERE a.style_id = 24 
   AND a.style_value = 'red'

Ответ 3

Вы никогда не получите результат, это простая логическая ошибка.

Вы запрашиваете, чтобы ваша база данных возвращала строку, которая имеет style_id = 24 AND style_id = 25 AND style_id = 26. Поскольку 24 - это niether 25 и 26, вы не получите никакого результата.

Вы должны использовать OR, тогда это имеет смысл.

Ответ 4

select unique red24.image_id from 
( 
    select image_id from 'list' where style_id = 24 and style_value = 'red' 
) red24
inner join 
( 
    select image_id from 'list' where style_id = 25 and style_value = 'big' 
) big25
on red24.image_id = big25.image_id
inner join 
( 
    select image_id from 'list' where style_id = 27 and style_value = 'round' 
) round27
on red24.image_id = round27.image_id

Ответ 5

Это может быть то, что вам нужно, хотя в зависимости от того, сколько стилей существует, было бы сложно реализовать (не уверены, являются ли эти стилиста статическими или нет). Если это так, то на самом деле невозможно, чего вы хотите, поскольку предложение WHERE работает на основе строки.

WITH cte as (
  SELECT
    image_id,
    max(decode(style_id,24,style_value)) AS style_colour,
    max(decode(style_id,25,style_value)) AS style_size,
    max(decode(style_id,27,style_value)) AS style_shape
  FROM
    list
  GROUP BY
    image_id
)
SELECT
  image_id
FROM
  cte
WHERE
  style_colour = 'red'
  and style_size = 'big'
  and style_shape = 'round'

http://sqlfiddle.com/#!4/fa5cf/18

Ответ 6

Может быть, с помощью этого запроса вы не получите никакого результата или пустого результата. Вам нужно использовать OR вместо AND в вашем запросе, как показано ниже.

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') OR (style_id = 25 AND style_value = 'big') OR (style_id = 27 AND style_value = 'round');

Попробуйте этот запрос.