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 BY
: SELECT 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时间