67

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

我有一个 MySQL 数据库。
它有一个名为“posted”的表。
它有 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 个,我只想要第一个(对于这个链接)。

4

13 回答 13

101

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

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

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX

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

这使得很难DISTINCT在单个列上使用,同时获取其他列,而不会做主要的极其丑陋的后空翻。

正确的答案是GROUP BY在您希望获得唯一答案的列上使用 a: SELECT col1, col2 FROM mytable GROUP BY col2 将为您提供任意唯一的col2行,以及它们的col1数据。

于 2012-11-29T02:20:32.773 回答
10

我试过这个:

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

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

你问的没有意义。

要么你想要 all of 的不同值link, id, day, month,要么你需要找到一个标准来选择id, day, month你想要使用的哪个值,如果你最多只想要一个不同的值link

否则,您所追求的类似于MySQL 在/ statements中的隐藏列GROUP BYHAVING,这是非标准 SQL,实际上可能会很混乱。

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

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

 SELECT link, id, day, month FROM posted
     WHERE (link, id) IN
           (SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link)
于 2012-07-25T01:21:17.657 回答
4
SELECT Id, Link, Day, Month FROM Posted
WHERE Id IN(
   SELECT Min(Id) FROM Posted GROUP BY Link)
于 2015-06-04T03:26:20.307 回答
3

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

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

同样,这是假设您要删除任何具有重复链接的内容。

于 2012-07-25T02:46:52.650 回答
3

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

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

希望这可以帮助。

于 2015-06-04T04:44:33.353 回答
2
  SELECT OTHER_COLUMNS FROM posted WHERE link in (
  SELECT DISTINCT link FROM posted WHERE ad='$key' )
  ORDER BY day, month
于 2012-07-25T00:56:15.753 回答
1

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

SELECT * FROM posted WHERE link in
     (SELECT link FROM posted WHERE ad='$key' GROUP BY link);
于 2012-07-25T01:10:17.740 回答
1
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
于 2012-07-25T00:55:07.080 回答
1

你想要的是以下内容:

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

例如,如果有 4 行链接相同,它将只选择一个(我假设第一个)。

于 2015-10-15T15:19:21.140 回答
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

两种方法对我有用。

于 2014-04-14T13:59:41.917 回答
0

在 MySQL 中,您可以简单地使用“分组依据”。下面将选择 ALL,带有 DISTINCT "col"

SELECT *
FROM tbl
GROUP BY col
于 2019-02-14T17:57:32.227 回答
0
SELECT a.* FROM orders a INNER JOIN (SELECT course,MAX(id) as id FROM orders WHERE admission_id=".$id." GROUP BY course ) AS b ON a.course = b.course AND a.id = b.id

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

于 2019-08-07T12:14:56.103 回答
-2

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

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

祝你好运............

或者

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

于 2014-04-04T04:59:00.393 回答