gpt4 book ai didi

php - 如果两个表中都没有任何行,如何不获取任何行?

转载 作者:行者123 更新时间:2023-11-30 00:01:39 25 4
gpt4 key购买 nike

在我们的网站上,我有 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 数据库不会返回预期的空结果集,而是返回一行,其中大多数字段填充了 NULLlast_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com