php - 使用 USING 和 WHERE AND OR 选择左连接

标签 php mysql sql select

我正在努力使用以下 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) 上建立索引。

我不能保证这会带来出色的性能,但这是一个起点。

编辑:

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%');

这可能会更快,因为子查询可能会更有效地优化。您可以单独尝试每一项,看看是否仍然存在性能问题。

关于php - 使用 USING 和 WHERE AND OR 选择左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42537242/

相关文章:

php foreach 输出所有内容两次

php - 输入文件更新数据库中的图像

mysql - MariaDB/MySQL : Get checksum of InnoDB table

sql - 当 JSON 包含 sql 关键字时无法获取结果

mysql - Sql 按其他表选择顺序

php - 关于如何使用 php 和 jQuery 创建测验的提示和建议

php - 在本地计算机上使用 phpMyAdmin 上传 MySQL 数据库时出现问题

php - Laravel 5 - Elequent GROUP BY 失败

mysql - 如何在 MySQL 中保存准确的日期时间

mysql - 如何从满足元数据表两个或多个条件的表中获取数据?