我是mysql的新手,我有一个相当复杂的查询,我相信可以缩短或优化。
有没有办法不每次都重复site = '{$site}'
条件?
或者在按个案订购结果时不重复第一个条件?
这个查询可以用很多单词重写吗?
SELECT * FROM {$table} WHERE
(site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%'))
OR
(site = '{$site}' AND (desc1 LIKE '%new%' OR desc2 LIKE '%smok%'))
ORDER BY CASE
WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1
ELSE 2 END
LIMIT 50
答案 0 :(得分:0)
这可能就像你得到的压缩一样:
SELECT * FROM table WHERE
site = 'site'
AND ((id LIKE '%bwm%' OR id LIKE '%merc%')
OR (desc1 LIKE '%new%' OR desc2 LIKE '%smok%')
)
ORDER BY CASE
WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1
ELSE 2 END
LIMIT 50
答案 1 :(得分:0)
您可以将前两个条件缩短为一个。但是,我认为你不能避免最后一次“WHEN site = ...”
SELECT * FROM {$table} WHERE
site = '{$site}' AND ( (id LIKE '%bwm%' OR id LIKE '%merc%')
OR (desc1 LIKE '%new%' OR desc2 LIKE '%smok%') )
ORDER BY CASE
WHEN (site = '{$site}' AND (id LIKE '%bwm%' OR id LIKE '%merc%')) THEN 1
ELSE 2 END
LIMIT 50
无论如何,这是一个非常简洁的陈述。
答案 2 :(得分:0)
试试这个:
SELECT *
FROM {$table}
WHERE
site = '{$site}'
AND (
id LIKE '%bwm%' OR id LIKE '%merc%'
OR desc1 LIKE '%new%' OR desc2 LIKE '%smok%'
)
ORDER BY
CASE WHEN (id LIKE '%bwm%' OR id LIKE '%merc%') THEN 1
ELSE 2
END
LIMIT 50
site = '{$site}'
子句中不需要 order by
,因为WHERE
子句会过滤掉不符合条件site = '{$site}
的行 - 换句话说,所有选定的行来自此网站{$site}
。