Php 如何编写MySql select语句以在一条语句中获取id的所有已定义设置或默认设置
在表Php 如何编写MySql select语句以在一条语句中获取id的所有已定义设置或默认设置,php,mysql,Php,Mysql,在表myTable中定义为: +----+---------+-----------+ | id | name | value | |----+---------+-----------+ | 7 | hand | right | | 5 | hand | left | | 0 | hand | both | | 0 | feet | both | | 0 | eyes | green | | 9
myTable
中定义为:
+----+---------+-----------+
| id | name | value |
|----+---------+-----------+
| 7 | hand | right |
| 5 | hand | left |
| 0 | hand | both |
| 0 | feet | both |
| 0 | eyes | green |
| 9 | eyes | blue |
| 2 | eyes | white |
| 2 | hand | raised |
+----+---------+-----------+
默认设置由id=0控制
我的问题是如何编写select语句,在一个查询中获取id=5的名称、值,该查询将包括id=5的set和任何未被覆盖的默认值
结果应该是:
+---------+-----------+
| name | value |
+---------+-----------+
| hand | left |
| feet | both |
| eyes | green |
+---------+-----------+
看来这一款适合你:
SELECT id,name,value
FROM test
WHERE id = 5
UNION
SELECT id,name,value
FROM test
WHERE id=0
and name not in (select name from test where id=5)
以下内容不会在结果集中返回三行,它只返回一行,其中包含列hand
、feet
和eyes
,因此它可能不适用于您。但它应该返回给定条件下您正在查找的数据:
SELECT (CASE
WHEN EXISTS(SELECT 1 FROM myTable WHERE name='hand' AND id=5)
THEN (SELECT `value` FROM myTable WHERE name='hand' AND id=5)
ELSE (SELECT `value` FROM myTable WHERE name='hand' AND id=0)
END) AS hand,
(CASE
WHEN EXISTS(SELECT 1 FROM myTable WHERE name='feet' AND id=5)
THEN (SELECT `value` FROM myTable WHERE name='feet' AND id=5)
ELSE (SELECT `value` FROM myTable WHERE name='feet' AND id=0)
END) AS feet,
(CASE
WHEN EXISTS(SELECT 1 FROM myTable WHERE name='eyes' AND id=5)
THEN (SELECT `value` FROM myTable WHERE name='eyes' AND id=5)
ELSE (SELECT `value` FROM myTable WHERE name='eyes' AND id=0)
END) AS eyes
;
输出:
+---------+-----------+-----------+
| hand | feet | eyes |
+---------+-----------+-----------+
| left | both | green |
+---------+-----------+-----------+
这种方法会生成10个不同的SELECT
语句,而不是1个,对于大多数应用程序来说,公认的答案可能是更好的方法
SELECT * FROM mytable WHERE ID = 5
UNION
SELECT * FROM mytable WHERE ID = 0 AND name NOT IN (SELECT name FROM MyTable
WHERE id = 5)
你应该会得到正确的答案未明确结果集的顺序是否重要,因此不妨尝试:
SELECT name,
value
FROM MyTable
WHERE id = 5
AND id NOT IN
(
SELECT id
FROM MyTable
WHERE id = 0
GROUP BY MyTable.id
)
UNION
SELECT name,
value
FROM MyTable
WHERE id = 0
AND name NOT IN
(
SELECT name
FROM MyTable
WHERE id = 5
GROUP BY MyTable.name
)
免责声明:已在SQL Server中测试,但未使用特定于该版本SQL的任何内容。因此id=0是“默认值”?这将很有趣,请观看并学习…是的,对于本例,id=0是默认值。我敢肯定,使用select子查询和大小写,最终按名称分组,就可以得到一条语句……只需要一些帮助,将它们混合在一起!不知道是谜语/谜语、“聪明”作业还是生产代码…>。Hi-Cteski-简化为生产代码的简单示例。这实际上是gui上的一小组用户首选项。在同一个表中为那些简单的首选项设置默认值可以减少一个表。有两个表的不同结构是另一种途径,但问题不同(设置获取/设置用户设置的最佳方式是什么)。[有时我希望我还在学校!]您好,谢谢您的尝试,但没有返回预期的结果,返回了hand的默认设置,而不是覆盖的值。嗯-我正在获得所需的编辑答案-使用您提供的数据进行检查。它可以选择任何组合。请检查您是否仍然需要它。嗨,没有返回预期的结果,请看这里:我只是非常挑剔,要给OP提供与他预期相同的结构,但在其他方面这看起来不错。嗨,Patrick/Jeff,想说明为什么这不合适。随着项目的增长,首选项(名称/值)也在增长,因为我们发现了一个允许用户设置首选项的位置,我们添加了一个默认设置。这样,当我们获得所有设置时,我们不需要知道select的单个名称。在您的尝试中,对于每个新设置,还必须编辑指数递增语句。相反,请看我接受的答案,我们将结果输入一个关联数组,然后让php在构建页面/填充模板时完成其余工作。@Marc我很感激,谢谢。我把这个答案留在这里纯粹是为了新奇。有人可能会晚些时候来(出于某种未知的原因)认为这种方式对他们更有效,尽管被接受的答案的动态性质让我很困惑为什么。祝你好运。嗨,没有产生预期的结果,并且有一个错误:你是正确的,谢谢。真的是指联合,因为我没有加入条款。现在,编辑将提供所需的结果。