Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写MySql select语句以在一条语句中获取id的所有已定义设置或默认设置_Php_Mysql - Fatal编程技术网

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我很感激,谢谢。我把这个答案留在这里纯粹是为了新奇。有人可能会晚些时候来(出于某种未知的原因)认为这种方式对他们更有效,尽管被接受的答案的动态性质让我很困惑为什么。祝你好运。嗨,没有产生预期的结果,并且有一个错误:你是正确的,谢谢。真的是指联合,因为我没有加入条款。现在,编辑将提供所需的结果。