有点奇怪的一个,我想编写一个MySQL查询来获取表中的结果,但更喜欢列的一个值而不是另一个,即
id name value prioirty
1 name1 value1 NULL
2 name1 value1 1
3 name2 value2 NULL
4 name3 value3 NULL
所以这里name1有两个条目,但是有一个prioirty为1.我想从表中获取所有值,但更喜欢我所追求的任何priorty值。
我想要的结果将是
id name value prioirty
2 name1 value1 1
3 name2 value2 NULL
4 name3 value3 NULL
相同的说法是“从表中获取所有行,但更喜欢优先级为x的行。”
答案 0 :(得分:2)
这应该这样做:
SELECT
T1.id,
T1.name,
T1.value,
T1.priority
FROM
My_Table T1
LEFT OUTER JOIN My_Table T2 ON
T2.name = T1.name AND
T2.priority > COALESCE(T1.priority, -1)
WHERE
T2.id IS NULL
这也允许你有多个优先级,最高级别是你要返回的优先级(如果有1和2,则返回2)。
我也会说,看起来数据库中确实存在一些设计问题。我的方法是:
My_Table(id,name) My_Values(id,priority,value) id为id的FK。 My_Table中id的id和id,My_Values中的优先级。当然,我也会使用适当的表名。
答案 1 :(得分:1)
您需要先重新设计表格。
应该是:
YourTable (Id, Name, Value)
YourTablePriority (PriorityId, Priority, Id)
更新
select * from YourTable a
where a.Id not in
(select b.Id from YourTablePriority b)
这应该在sql server中工作,你可能需要做一些改动才能使它在mysql中运行。
答案 2 :(得分:0)
可能是这样的:
SELECT id, name, value, priority FROM
table_name GROUP BY name ORDER BY priority
虽然我面前没有数据库但我无法测试...
答案 3 :(得分:0)
如果我理解正确,您希望value
name
给定特定 priority
,或者value
与NULL关联priority
。 (您不一定希望存在MAX(priority)
。)
是的,你有一些尴尬的设计问题,你应该解决,但让我们解决你目前遇到的问题(你可以稍后迁移到你应该有的问题:)):
mysql> SET @priority = 1; -- the priority we want, if recorded
mysql> PREPARE stmt FROM "
SELECT
t0.*
FROM
t t0
LEFT JOIN
(SELECT DISTINCT name, priority FROM t WHERE priority = ?) t1
ON t0.name = t1.name
WHERE
t0.priority = t1.priority
OR
t1.priority IS NULL
";
mysql> EXECUTE stmt USING @priority;
+----+-------+--------+----------+
| id | name | value | priority |
+----+-------+--------+----------+
| 2 | name1 | valueX | 1 |
| 3 | name2 | value2 | NULL |
| 4 | name3 | value3 | NULL |
+----+-------+--------+----------+
3 rows in set (0.00 sec)
(请注意,我在上面将“name1”的优先级value
更改为“valueX” - 无论优先级如何,您的原始公式都具有相同的{name1“value
值,这使得它成为了我很难理解你为什么要彼此区别对方。)