Как найти все продукты с определенными значениями нескольких атрибутов - PullRequest
1 голос
/ 23 ноября 2011

Я использую postgresql.

У меня есть таблица с именем custom_field_answers. Данные выглядят так:

Id | product_id | value      | number_value | 
4  | 2          |            | 117          |
3  | 1          |            | 107          |
2  | 1          | bangle     |              |
1  | 2          | necklace   |              |

Я хочу найти все продукты, у которых text_value равно 'bangle' и number_value меньше 50.

Вот моя первая попытка.

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" ILIKE 'bangle')

Вот моя вторая попытка.

 SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
where ("custom_field_answers"."number_value" < 50)

Вот моя последняя попытка.

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" ILIKE 'bangle') 
AND ("custom_field_answers"."number_value" < 50)

, но это не выбирает запись продукта.

Ответы [ 5 ]

1 голос
/ 23 ноября 2011

Предложение WHERE может просматривать только столбцы из одной строки за раз.

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

SELECT p.*
FROM "products" AS p
INNER JOIN "custom_field_answers" AS a1 ON p."id" = a1."product_id"
INNER JOIN "custom_field_answers" AS a2 ON p."id" = a1."product_id" 
WHERE a1."value" = 'bangle' AND a2."number_value" < 50
1 голос
/ 23 ноября 2011

Он не создает записей, поскольку нет записи custom_field_answers, удовлетворяющей обоим критериям. То, что вы хотите, это список product_id с необходимыми записями в таблице. Просто на тот случай, если никто не сможет написать для вас SQL, и пока у меня не появится возможность самому его обработать, я подумал, что хотя бы объясню вам, почему ваш запрос не работает.

0 голосов
/ 23 ноября 2011

На самом деле это не проверялось, но эта общая идея должна работать:

SELECT *
FROM products
WHERE
    EXISTS (
        SELECT *
        FROM custom_field_answers
        WHERE
            custom_field_answers.product_id = products.id
            AND value = 'bangle'
    )
    AND EXISTS (
        SELECT *
        FROM custom_field_answers
        WHERE
            custom_field_answers.product_id = products.id
            AND number_value < 5
    )

На простом английском языке: Получить все продукты, которые ...

  • естьсвязанная строка в custom_field_answers, где value = 'bangle'
  • , и есть (возможно, другая) связанная строка в custom_field_answers, где number_value < 5.
0 голосов
/ 23 ноября 2011

Ваши поля number_value, связанные с браслетом, имеют нулевое значение, поэтому вы не сможете выполнить прямое сравнение в этих случаях. Вместо этого сначала преобразуйте свои нули в 0.

SELECT "products".* FROM "products" INNER JOIN "custom_field_answers" 
ON "custom_field_answers"."product_id" = "products"."id" 
WHERE ("custom_field_answers"."value" LIKE '%bangle%') 
AND (coalesce("custom_field_answers"."number_value", 0) < 50)
0 голосов
/ 23 ноября 2011

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

ВЫБЕРИТЕ стр. * ИЗ ПРОДУКТОВ ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ custom_field_answers c ON (c.product_id = p.id AND c.value LIKE '% bangle%' AND c.number_value

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...