MySQL 动态生成多个 where 子句
MySQL multiple where clauses generated dynamically
这样用户就可以选择他想要过滤列表的类别数量
当只选择一项时一切正常:
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr, b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family = 'R660'
ORDER BY a.PAnr desc
LIMIT 0, 10
但是当用户添加更多时:
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr, b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family = 'R540' OR b.family = 'R660'
ORDER BY a.PAnr desc
LIMIT 0, 10
当不带 AND 部分的 table 约为 4000 时,我得到了大约 400 万次点击。如果用户选择另一个,则有大约 800 万次点击。
我错过了什么?
您将 and
和 or
子句混合在一起而没有 ()
,因此您实际上是 运行:
WHERE ((a.id = b.test_id) AND (b.family = 'R540'))
OR (b.family = 'R660')
请注意 ()
的位置。
你可能想要
WHERE (a.id = b.test_id) AND (b.family IN ('R540', 'R660'))
将您的查询更改为此,您的查询将不会 运行 OR 语句如预期的那样,
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr,
b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND (b.family = 'R540' OR b.family = 'R660')
ORDER BY a.PAnr desc
LIMIT 0, 10
或者
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr,
b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family IN ('R540','R660')
ORDER BY a.PAnr desc
LIMIT 0, 10
这样用户就可以选择他想要过滤列表的类别数量
当只选择一项时一切正常:
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr, b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family = 'R660'
ORDER BY a.PAnr desc
LIMIT 0, 10
但是当用户添加更多时:
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr, b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family = 'R540' OR b.family = 'R660'
ORDER BY a.PAnr desc
LIMIT 0, 10
当不带 AND 部分的 table 约为 4000 时,我得到了大约 400 万次点击。如果用户选择另一个,则有大约 800 万次点击。 我错过了什么?
您将 and
和 or
子句混合在一起而没有 ()
,因此您实际上是 运行:
WHERE ((a.id = b.test_id) AND (b.family = 'R540'))
OR (b.family = 'R660')
请注意 ()
的位置。
你可能想要
WHERE (a.id = b.test_id) AND (b.family IN ('R540', 'R660'))
将您的查询更改为此,您的查询将不会 运行 OR 语句如预期的那样,
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr,
b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND (b.family = 'R540' OR b.family = 'R660')
ORDER BY a.PAnr desc
LIMIT 0, 10
或者
SELECT SQL_CALC_FOUND_ROWS a.id, a.PAnr, b.family, b.articlenr,
b.ratio, a.oiltype, a.oiltemp
FROM testdata_test a, testdata_gear b
WHERE a.id = b.test_id AND b.family IN ('R540','R660')
ORDER BY a.PAnr desc
LIMIT 0, 10