如果问题看起来太基本,我很抱歉
我已经浏览了整个互联网和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个,我只想要第一个(对于这个链接)。
答案 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
祝你好运............
或
如果您有日期列,则时间戳将格式转换为日期并在链接上执行不同的操作,以便您可以根据日期而不是日期时间获取不同的链接值