У меня есть таблица вроде этого:
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');
Попробуйте этот запрос.