php - 条件偏好 sql 的更好方法

标签 php mysql sql

我有一个名为 items 的表,如下所示:

id oId key    value
1  0   color  green
2  0   size   30
3  1   color  red 
4  2   color  blue

上面 oId=0 的行指定了项目的默认值。
我需要选择具有特定 oId 的项目的所有 keyvalue,如果特定的话,它将包括默认值 (oId=0) oIdkeyvalue 不存在。

例如。对于第 2 项,它应该返回

id oId key   value
1  0   size  30
2  2   color blue

我写了以下查询:

SELECT * FROM items AS i
WHERE i.oId=0 AND
i.key NOT IN (SELECT key FROM items WHERE oId=2) 
UNION ALL
SELECT * FROM items WHERE oId=2

有没有办法优化上面的查询?

最佳答案

您可以在正确的索引上使用 JOIN:

SELECT t1.`key`, IFNULL(t2.value, t1.value)
FROM `items` AS t1

LEFT JOIN `items` AS t2
ON t1.`key` = t2.`key` AND t2.`oId` = 2

WHERE t1.`oId` = 0;

SQLFiddle

关于php - 条件偏好 sql 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26063520/

相关文章:

PHP MySQL 插入查询不工作

php - 更新超过三行时mysqli stmt错误?

php - cron 作业替代品?

PHP套接字,无法连接 - 循环?

php - 在 SQL 查询中使用变量(不是用户输入的)

php - 如何计算 wp-db7 表单中特定表单帖子 id 的行数

java - 如何在 JOOQ 中将 Record 转换为 Table Record?

MySQL - 我没有看到数据,但 mysql 说,有行

mysql - 如何对 varchar 进行排序

mysql - SQL 查询根据描述查找行