[英]trying to select where left join is null using doctrine query builder
[英]SELECT LEFT JOIN with USING and WHERE AND OR
我正在尝试以下SQL查询来显示来自mysql数据库的搜索结果
这有效
SELECT
*
FROM
lagerbestand
LEFT JOIN
verkaufspreis USING (materialnummer)
WHERE
lagerbestand.level='2' AND (lagerbestand.materialnummer='$suche' OR lagerbestand.materialkurztext LIKE '%$suche%')
这也有效
SELECT
*
FROM
lagerbestand
LEFT JOIN
verkaufspreis USING (materialnummer)
WHERE
lagerbestand.materialnummer='$suche' OR verkaufspreis.bezeichnung_fr LIKE '%$suche%'
但这行不通
SELECT
*
FROM
lagerbestand
LEFT JOIN
verkaufspreis USING (materialnummer)
WHERE
lagerbestand.level='2' AND (lagerbestand.materialnummer='$suche' OR verkaufspreis.bezeichnung_fr LIKE '%$suche%')
唯一的不同是最后一点。
lagerbestand.materialkurztext更改为verkaufspreis.bezeichnung_fr
然后脚本将永远加载。
我将从使用索引加快查询速度开始。 另外,如果没有必要,请将引号从2
删除:
SELECT *
FROM lagerbestand l LEFT JOIN
verkaufspreis v
USING (materialnummer)
WHERE l.level = 2 AND (l.materialnummer = '$suche' OR v.materialnummer LIKE '%$suche%');
对于此查询,您需要在lagerbestand(level, bezeichnung_fr)
和verkaufspreis(materialnummer, bezeichnung_fr)
上lagerbestand(level, bezeichnung_fr)
索引。
我不保证这会带来出色的性能,但这是一个起点。
编辑:
OR
可能难以优化查询。 下一个想法是使用union all
:
SELECT *
FROM lagerbestand l LEFT JOIN
verkaufspreis v
USING (materialnummer)
WHERE l.level = 2 AND l.materialnummer = '$suche'
UNION ALL
SELECT *
FROM lagerbestand l JOIN
verkaufspreis v
USING (materialnummer)
WHERE l.level = 2 AND (l.materialnummer <> '$suche' AND v.materialnummer LIKE '%$suche%');
这可能会更快,因为可能会更有效地优化子查询。 您可以独立尝试每一个,以查看是否仍然存在性能问题。
如果我想返回上一个查询中指定的集合,则我认为最佳性能的最佳选择是将其分解为两个不同的集合,然后将它们与UNION ALL集合运算符组合。
(如果$such
是要替换为SQL文本的变量,则在包含它之前,我将确保它已正确转义。)
SELECT l.*, v.*
FROM lagerbestand l
LEFT JOIN verkaufspreis v USING (materialnummer)
WHERE l.level = '2'
AND l.materialnummer = '$suche'
UNION ALL
SELECT l.*, v.*
FROM lagerbestand l
JOIN verkaufspreis v USING (materialnummer)
WHERE l.level = '2'
AND NOT ( l.materialnummer <=> '$suche' )
AND v.bezeichnung_fr LIKE CONCAT('%','$suche','%')
然后,我将使用EXPLAIN
分别调整每个SELECT,以确保可以使用适当的索引。
ON verkaufspreis (materialnummer, bezeichnung_fr, ... )
ON lagerbestand (level, materialnummer, ... )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.