在同一列上按多个值过滤

时间:2018-06-18 12:53:58

标签: sql attributes opencart conditional-statements where

以下是表的简化版本和任务本身(如果是) 实际的表是来自Opencart的数据库的任何帮助,所以我想要的 实现的是按制造商和属性过滤商店中的产品。我只需要提示如何在sql中实现这一点,而不一定是特定于opencart。尝试学习SQL所以请不要建议使用模块。

表:

product
-------------------
ID name description manufacturer_id
0  n0   desc0       33
1  n1   desc1       56
2  n2   desc2       68

product_attribute
-------------------
pID ID text
0   12 red 
0   13 xl
1   12 red
1   13 xs
2   13 xxl

SQL按制造商和属性过滤产品,两者之间的条件 属性组(例如'color,size,..')应该是AND,之间的条件 同一组的属性(例如'color')应为OR。说我想得到 有制造商的产品(33或56)和颜色'红色或绿色'和大小'xl OR xxl':

---------------
Manufacurer
    ✓ 33
    ✓ 56
    o 68

Color
    ✓ red
    ✓ green

Size
    ✓ xl
    o xs
    ✓ xxl
---------------

SELECT p.ID
FROM product p
LEFT JOIN product_attribute pa ON (pa.pID = p.ID)
WHERE p.manufacturer_id = 33 OR p.manufacturer_id = 56
AND   pa.text = red OR pa.text = green
AND   pa.text = xl  OR pa.text = xxl

应该返回:

result table
--------------
ID
0

2 个答案:

答案 0 :(得分:0)

逻辑运算具有常规数学中的优先级。

AND运算符的优先级高于OR,与乘法优先于加法的方式相同。

此外,由于您正在使用字符串,请不要忘记使用双引号或简单引号。

p.manufacturer_id = 33 OR p.manufacturer_id = 56
AND   pa.text = "red" OR pa.text = "green"
AND   pa.text = "xl"  OR pa.text = "xxl"

将提供与

相同的结果
p.manufacturer_id = 33
OR (p.manufacturer_id = 56 AND pa.text = "red")
OR (pa.text = "green" AND pa.text = "xl")
OR pa.text = "xxl"

我想你的例子中的查询结果是

result table
--------------
ID
0
1
2

我建议您使用括号来确保您的条件得到很好的尊重。

(p.manufacturer_id = 33 OR p.manufacturer_id = 56)
AND (pa.text = "red" OR pa.text = "green")
AND (pa.text = "xl"  OR pa.text = "xxl")

上述查询无效,因为对于唯一条目,如果(pa.text = "red" OR pa.text = "green")为真,那么(pa.text = "xl" OR pa.text = "xxl")将为false(因为pa.text值已经是“红色”或“绿色” )

由于您需要具有红色或绿色以及xl或xxl大小的条目,因此您可以搜索具有2个thoses的条目我认为产品不能同时为绿色和红色,并且不能有2个不同的大小

SELECT p.ID
FROM product p
LEFT JOIN product_attribute pa ON (pa.pID = p.ID)
WHERE (p.manufacturer_id = 33 OR p.manufacturer_id = 56)
AND pa.text IN ("red", "green", "xl", "xxl")
GROUP by pa.text
HAVING COUNT(*) = 2

结果

ID
--
1

1因为我用MySQL测试它,它用1启动自动递增的索引。

Test it yourself

答案 1 :(得分:0)

使用Show Tables;

dag = airflow.DAG(
    'process_dimensions',
    schedule_interval="@daily",
    dagrun_timeout=timedelta(minutes=60),
    default_args=args,
    max_active_runs=1)

process_product_dim = SQLOperator(
    task_id='process_product_dim',
    conn_id='??????',
    sql='Show Tables',
    dag=dag)

你还需要围绕字符串常量的单引号。

编辑:

根据你的编辑,我想你想要:

IN