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

标签 php mysql sql

在我们的网站上,我有 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/

相关文章:

sql - 将平面表解析为树的最有效/优雅的方法是什么?

sql - 如何计算一段时间内每月的记录数

php - 在 session 中保存对象是一种好习惯吗?

mysql:像 SQS 一样的排他性选择?

mysql - 在 MySQL 中将表汇总并拆分为不同的表

php mysql 错误 - #1273 - #1273 - 未知排序规则 : 'utf8mb4_general_ci'

sql - 为什么长文本字段在 MS ACCESS 2013 查询中只返回 255 个字符?

php - 使用 $_GET 和 $_POST

javascript - 使用 this.form.submit() 提交表单后无法获取表单元素的值;

php - mod_rewrite 高效的可选参数处理