MySQL – select所有列WHERE一列是DISTINCT

如果这个问题太简单,我很抱歉。
我已经浏览了整个互联网和StackOverflow的完成解决scheme,并没有发现任何我能理解,不能自己写,所以不得不在这里问。

我有一个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个,我只想要第一个(为这个链接)。

问题来自本能地认为DISTINCT是一个列的本地预修饰符。

因此,你“应该”能够打字

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX

并让它返回col 2的唯一值。 可悲的是,不。 DISTINCT实际上是SELECT的全局后置修饰符,也就是说,与SELECT ALL (返回所有答案)相反,它是SELECT DISTINCT (返回所有唯一的答案)。 所以,一个DISTINCT作用于所有你给它的列上。

这使得在单列上使用DISTINCT非常困难,同时获得其他列,而没有做大的非常丑陋的后空翻。

正确的答案是在你想要有唯一答案的列上使用GROUP BYSELECT col1, col2 FROM mytable GROUP BY col2会给你任意唯一的col2行,以及它们的col1数据。

我试过这个:

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

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

你所问的没有意义。

要么你想要所有的link, id, day, month的独特价值,或者你需要find一个标准,select你想使用的id, day, month的价值,如果你只是最多只有一个不同的价值的link

否则,你所追求的与GROUP BY / HAVING语句中的MySQL隐藏列相似,这是非标准的SQL,实际上可能相当混乱。

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

或者,您可以使用子select来挑选每个link值具有最小id的行(如本答案中所述 ):

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

要么

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

如果你想要链接是唯一的所有列:

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

如果你的要求是只显示有1个链接的行,那么你可以使用下面的代码:

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

再次,这是假设你想切出任何有重复的链接。

  SELECT OTHER_COLUMNS FROM posted WHERE link in ( SELECT DISTINCT link FROM posted WHERE ad='$key' ) ORDER BY day, month 
 SELECT Id, Link, Day, Month FROM Posted WHERE Id IN( SELECT Min(Id) FROM Posted GROUP BY Link) 

我认为最好的解决办法是做一个子查询,然后把它join到表中。 子查询将返回表的主键。 这里是一个例子:

 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子句。

希望这可以帮助。

我有一个类似的问题,也许有人帮助,例如 – 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 

两种方式为我工作。

你想要的是以下几点:

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

如果有4行,例如链接是相同的,它将只select一个(我作为第一个)。

select月份的date列,以便每个链接只能得到一行,例如:

 select link, min(datecolumn) from posted WHERE ad='$key' ORDER BY day, month 

祝你好运…………

要么

ü如果你有date列作为时间戳转换格式date和执行截然不同的链接,以便您可以获得不同的链接值的基础上date而不是date时间