SELECT DISTINCT与其他专栏

时间:2019-03-01 03:46:25

标签: php mysql

我有一个问题。

我有以下mysql表:

domain       | visited
domain1.net  | 21.02.2019 - 18:55
domain1.net  | 20.02.2019 - 14:01
domain1.net  | 22.02.2019 - 12:05
domain2.net  | 24.02.2019 - 19:01
domain2.net  | 22.02.2019 - 17:21

我想要以下结果:

domain1.net | 22.02.2019 - 12:05
domain2.net | 24.02.2019 - 19:01

没有重复的域,也没有最新访问的域。

我的代码:

<?php
$sql = "SELECT DISTINCT p_domain FROM table_content";
$result = $db->prepare($sql);
$result->execute();
while ($row = $result->fetch()) {
$domain = $row['domain'];

echo "<tr>"    
. "<td>$domain</td>"
. "</tr>";
}
?>

2 个答案:

答案 0 :(得分:0)

您使用GROUP BY:

SELECT p_domain, MAX(visited) as most_recent_visit
FROM table_content
GROUP BY p_domain

分组依据将建立您想要唯一组合的列的列表。您选择的其他不在列表中的列不构成唯一的分组键,必须表示为某种形式的聚合:

SELECT ethnicity, city, AVG(age), COUNT(*), SUM(number_of_cars_owned), MIN(birthdate), MAX(number_of_children)
FROM person_table
GROUP BY ethnicity, city

这将获得平均年龄,总人数,拥有的汽车总数,最老的人,每个城市每个族裔的最大家庭

重要的是要注意,合计的值来自不同的行(在芝加哥高加索类别中,史密斯一家可能有最多的孩子,而母鹿一家有最大的孩子),并且可能不在列表中。排成一行(平均年龄可能是27.32615)。

一个常见的查询就像“我想找到某人访问我的每个站点的最早日期以及他们的IP地址是什么” –即site, min(visitdate) group by site,但您不能仅在其中敲击IP地址也可以作为一个分组site, ipaddress min(visitdate) group by site, ipaddress,因为这是“每个站点每个ip的首次访问”,并且您不能将ip打包为一个聚合函数site, min(visitdate), min(ipaddress) group by site,因为最小ip可能来自其他排至最晚日期。

如果要使用站点,首次访问日期和该访问的ip,则必须将聚合作为子查询运行,并将其连接回主表,以从具有最小日期的行中获取其他数据

select * 
from 
  (select site, min(visitdate) min_d from t group by site) x
  inner join t on t.site = x.site and t.visitdate = x.min_d

ps:评论很有意义;如果您访问的日期不是日期,而是一个看起来像日期的字符串,则获取它的MAX()不一定会返回最近的日期,而是会按字母顺序返回最新的日期日期。您绝对应该使用正确的日期/时间数据类型存储日期,以便MAX等函数可以正常工作。如果您尚未执行此操作,请更改操作,使其像这样进行..因为编写查询以在每次运行时将数百万个字符串解析为日期,这样max才能正常工作,这是对资源的巨大浪费。

答案 1 :(得分:0)

您可以在列中使用域DISTINCT,以获得最新访问的域,您可以使用Order by

SELECT DISTINCT domain FROM table_content Order By visited DESC
  

ORDER BY :Order by子句用于按升序或降序对数据进行排序。

     

DISTINCT :SELECT DISTINCT语句用于从数据库中仅检索不同(不同)的值。