在我们的网站上,我有 profile.php 文件,使用以下 SQL 查询从数据库生成特定于用户的配置文件。
select
u.username,
u.email,
u.access,
date_format(u.registerdate, '%e. %c. %Y') as `registered`,
date_format('00-00-0000 00:00', '%e. %c. %Y') as `last_visited`,
count(p.id) as `posts`
from
users u,
posts p
where
u.username = ? AND p.post_creator = u.id
;
下面我使用 mysql_num_rows()
函数测试用户是否存在及其所有数据(请避免评论有关使用已弃用的 PHP 的 MYSQL 扩展,我只是在改进 friend 的旧代码)。
问题就在这里,因为如果我在 WHERE
子句中输入不存在的用户名(替换问号),MySQL 数据库不会返回预期的空结果集,而是返回一行,其中大多数字段填充了 NULL
,last_visit
包含预期的 0。 0. 0000
和包含 0
(零)的 posts
。
它很漂亮,但我不想在我的 PHP 脚本中测试一些独特的字段(例如 u.username
),无论它们是否为空/NULL
,因为这是一种非常肮脏的检查方式。
我仍然想获得空结果集。我尝试了JOIN
,然后WHERE (...) AND u.id is not null
,但两者都不起作用(没有行为改变)。然后我尝试了 HAVING u.id is not null
并在向 SELECT (...)
表达式添加一列后,它起作用了。
但我知道 HAVING
子句旨在用于在选择后过滤结果集。我问你:
有没有更干净的方法来做到这一点?在 SELECT
时提及以这种方式过滤行。 (或者这是一个好的做法吗?我还没有找到我的问题的完美答案。)
最佳答案
我相信您的问题是由于 group by
的一些奇怪行为引起的。即使所有行都被过滤掉,没有行的聚合查询总是返回一行。使用 group by
的聚合查询可以返回 0 行。所以,我认为您只想添加一个 group by
:
select u.username, u.email, u.access,
date_format(u.registerdate, '%e. %c. %Y') as `registered`,
date_format('00-00-0000 00:00', '%e. %c. %Y') as `last_visited`,
count(p.id) as `posts`
from users u join
posts p
on p.post_creator = u.id
where u.username = ?
group by u.username;
请注意,我还更改了查询,以使用显式 join
语法以及 on
子句中的联接条件。显式连接比隐式连接更强大。
关于php - 如果两个表中都没有任何行,如何不获取任何行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983560/