如何对包含子句“order by”、“desc”和“Limit”的多个列使用 distinct
Posted
技术标签:
【中文标题】如何对包含子句“order by”、“desc”和“Limit”的多个列使用 distinct【英文标题】:how to use distinct with multiple columns containing clause "order by" , "desc", and "Limit" 【发布时间】:2012-10-05 21:43:22 【问题描述】:我需要具有attributeId 和attribute 值的最新添加的三个值,但两者都不同。我的要求主要是attributeValue,但具有不同的最新添加的attributeId。下面是我的查询.. 有什么解决方案吗?
SELECT DISTINCT attributeValue
FROM user_trans_service_selection
ORDER BY uniqueId DESC LIMIT 0,3
下面是我的桌子
uniqueId - attributeId - attributeValue 1 - 101 - 6700 2 - 102 - 受雇 3 - 103 - 城市 4 - 101 - 8900 5 - 102 - 受雇 6 - 102- 学生 7 - 103 - 镇 8 - 103 - 村庄attributeId - 属性值 101 - 8900 102 - 学生 103 - 村庄我希望结果为:
【问题讨论】:
【参考方案1】:有点类似于 Gordon Linoff 的回答。在 sql server 中你不使用 LIMIT
sqlfiddler
select utss.attributeid, utss.attributeValue
from user_trans_service_selection utss
inner join
(select top 3 attributeid, max(uniqueid) as maxid
from user_trans_service_selection
group by attributeid
order by max(uniqueid)
) attr
on attr.maxid = utss.uniqueid
【讨论】:
auuhh .. 它在 sql fiddler 上完美运行,但在 mysql 5.6 上它给了我错误你知道为什么会发生这种情况......我向你保证语法错误会被注意!! 等一下...... mysql 不支持糟糕的顶部......哈哈!! nywaz 我用 desc 和 limit 替换了它!!【参考方案2】://我们将为此使用 GROUP BY 函数
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
// 按照这些 V 步骤 A, B 和 C 为每个 [attributeId] 找到最后添加的记录 // A 为每个 [attributeId] 查找最后添加的记录(例如最高 [uniqueId])
SELECT attributeId, max(uniqueId) FROM table_name GROUP BY attributeId
// B 我们稍后会将此结果嵌套在最终查询的 where 子句中,但首先我们必须去掉 [attributeId]
SELECT uniqueId FROM( SELECT attributeId, max(uniqueId) FROM table_name GROUP BY attributeId)
// C 现在我们可以创建最终查询并从表 [table_name] 中选择我们需要的内容。在此查询的 WHERE 子句中,我们可以放置一个过滤器,仅显示我们在 B
中找到的那些 id 的信息SELECT uniqueId, attributeId, attributeValue FROM table_name WHERE attributeId IN ( SELECT attributeId FROM( SELECT attributeId, max(uniqueId) FROM table_name GROUP BY attributeId))
【讨论】:
这是别名问题,因为我不知道你到底要做什么..请把它放在 sqlfiddler 上!!【参考方案3】:您想要的是每个属性具有最高 id 的行。你需要加入才能得到这个:
select utss.attributeid, utss.attributeValue
from user_trans_service_selection utss join
(select attributeid, max(uniqueid) as maxid
from user_trans_service_selection
group by attributeid
) attr
on attr.maxid = utss.id
order by maxid desc
limit 0, 3
【讨论】:
不,我的朋友,这段代码对我不起作用..我需要最后三个添加的具有不同attributeId的attributevalue!这就是为什么我使用带限制的 desc ? @Jordon 不行还是不行?我的意思是你是测试还是什么?如果问题是要获得最后 3 个,只需添加order by uniqueid desc limit 3
就像你已经做的那样。
它可以正常工作,但即使通过 uniqueId desc limit 0,3 添加订单,我想要的值也不会出现!【参考方案4】:
最终完全没有错误的工作代码如下:
select utss.attributeid, utss.attributeValue
from user_trans_service_selection utss
inner join
(select attributeid, max(uniqueid) as maxid
from user_trans_service_selection
group by attributeid
order by max(uniqueId) desc limit 0,3
) attr
on attr.maxid = utss.uniqueid
谢谢大家!!!
【讨论】:
以上是关于如何对包含子句“order by”、“desc”和“Limit”的多个列使用 distinct的主要内容,如果未能解决你的问题,请参考以下文章