MySQL获取行但更喜欢一个列值而不是另一个列值

时间:2009-12-04 18:11:25

标签: sql mysql

有点奇怪的一个,我想编写一个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的行。”

4 个答案:

答案 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值,这使得它成为了我很难理解你为什么要彼此区别对方。)