我有一个问题。
我有以下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>";
}
?>
答案 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语句用于从数据库中仅检索不同(不同)的值。