MySQL - 选择所有列WHERE一列是DISTINCT

时间:2012-07-25 00:52:59

标签: mysql sql

如果问题看起来太基本,我很抱歉 我已经浏览了整个互联网和StackOverflow以获得完整的解决方案,并没有找到任何我能理解的内容,也无法自己编写,所以不得不在这里提问。

我有一个MySQL数据库 它有一个名为“已发布”的表格 它有8列。

我需要输出这个结果:

SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month

但我不仅需要“链接”列,还需要此行的其他列 对于通过此查询返回的每一行,我还需要知道表中的“id”,“day”和“month”值等。

请告诉我应该阅读什么,或者如何制作它 请保持尽可能简单,因为我不是MySQL的专家。

编辑: 我试过这个:

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

它不起作用。它返回太多行。假设有10行具有相同的链接,但不同的日/月/ ID。这个脚本将返回全部10个,我只想要第一个(对于这个链接)。

13 个答案:

答案 0 :(得分:83)

问题来自于本能地相信DISTINCT是列的本地预修饰符。

因此,您“应该”能够输入

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX

并让它返回col 2的唯一值。 可悲的是,不。 DISTINCT实际上是SELECT的全局后修饰符,也就是说,与SELECT ALL(返回所有答案)相反,它是{{ 1}}(返回所有唯一答案)。因此,单个SELECT DISTINCT会对您提供的所有列执行操作。

这使得在单个列上使用DISTINCT变得非常困难,同时获取其他列,而不会执行非常难看的后期翻转。

正确的答案是在您希望获得唯一答案的列上使用DISTINCT GROUP BY 会为您提供任意唯一SELECT col1, col2 FROM mytable GROUP BY col2行,还有他们的col2数据。

答案 1 :(得分:8)

  

我试过了:

SELECT DISTINCT link,id,day,month FROM posted
     WHERE ad='$key' ORDER BY day, month
     

它不起作用。它返回太多行。假设有10行   相同的链接,但不同的日/月/ ID。此脚本将全部返回   10,我只想要第一个(对于这个链接)。

你问的是没有意义的。

要么您想要所有link, id, day, month的明确值,要么您需要找到一个标准来选择您想要使用的id, day, month的哪个值,如果您只想要一个不同的价值link

否则,您所追求的与MySQL's hidden columns in GROUP BY/HAVING statements类似,这是非标准SQL,实际上可能非常混乱。

如果选择给定GROUP BY link值的任何行是有意义的,您实际上可以使用link

或者,您可以使用子选择为每个id值选择最小link的行(如this answer中所述):

 SELECT link, id, day, month FROM posted
     WHERE (link, id) IN
           (SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link)

答案 2 :(得分:3)

如果您的要求仅显示有1个链接的行,那么您可以使用以下内容:

SELECT * FROM posted WHERE link NOT IN 
(SELECT link FROM posted GROUP BY link HAVING COUNT(LINK) > 1)

再次假设您想要删除任何具有重复链接的内容。

答案 3 :(得分:2)

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

OR

SELECT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

答案 4 :(得分:2)

SELECT Id, Link, Day, Month FROM Posted
WHERE Id IN(
   SELECT Min(Id) FROM Posted GROUP BY Link)

答案 5 :(得分:2)

我认为最好的解决方案是做一个子查询,然后将其加入到表中。子查询将返回表的主键。这是一个例子:

select *
from (
          SELECT row_number() over(partition by link order by day, month) row_id
          , *

          FROM posted 
          WHERE ad='$key' 
          ) x
where x.row_id = 1

这样做是row_number函数放置由导致查询的每个不同链接分区的数字序列。

只获取那些= 1的row_numbers,然后每个链接只返回1行。

您更改标记链接的方式" 1"是通过row_number函数中的order-by子句。

希望这有帮助。

答案 6 :(得分:1)

  SELECT OTHER_COLUMNS FROM posted WHERE link in (
  SELECT DISTINCT link FROM posted WHERE ad='$key' )
  ORDER BY day, month

答案 7 :(得分:1)

如果您希望链接唯一的所有列:

SELECT * FROM posted WHERE link in
     (SELECT link FROM posted WHERE ad='$key' GROUP BY link);

答案 8 :(得分:1)

您想要的是以下内容:

SELECT DISTINCT * FROM posted WHERE ad='$key' GROUP BY link ORDER BY day, month

如果有4行,例如链接是相同的,它将只选择一行(我认为第一行)。

答案 9 :(得分:0)

我有一个类似的问题,也许是帮助某人,例如 - 有3列的表

SELECT * FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC

SELECT Data_Id, Data_Text, Data_Name FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC

两种方式对我有用。

答案 10 :(得分:0)

在MySQL中,您可以简单地使用“ group by”。下面将选择ALL,并使用DISTINCT“ col”

SELECT *
FROM tbl
GROUP BY col

答案 11 :(得分:0)

选择a。* FROM订单进行内部联接(SELECT的课程,MAX(id)为id,从订单的WHEREmission_id =“。$ id。” GROUP BY的课程)作为b。a.course = b.course AND a.id = b.id

  

使用“上面的查询”,您将获得具有where条件的唯一记录

答案 12 :(得分:-1)

选择月份的日期列,以便每个链接只能获得一行,例如:

select link, min(datecolumn) from posted WHERE ad='$key' ORDER BY day, month
祝你好运............

如果您有日期列,则时间戳将格式转换为日期并在链接上执行不同的操作,以便您可以根据日期而不是日期时间获取不同的链接值