【问题标题】:How can I get a SQL query to show one value if another value is empty/not existent如果另一个值为空/不存在,我如何让 SQL 查询显示一个值
【发布时间】:2016-05-08 22:46:02
【问题描述】:

我目前有一个查询,当我运行它时它给了我一个错误,错误在这部分:

CASE ISNULL(po.u_id, "") WHEN "" THEN th.u_id ELSE po.u_id END AS idFix

整个查询:

SELECT *, count(th.t_id) AS threadCount, count(po.p_id) as postCount, CASE ISNULL(po.u_id, "") WHEN "" THEN th.u_id ELSE po.u_id END AS idFix, CASE WHEN th.postdate > IFNULL(po.postdate, "0000-01-01 00:00:00") THEN max(th.postdate) ELSE max(po.postdate) END AS lastdate FROM thread th LEFT OUTER JOIN threadpost po ON th.t_id = po.t_id WHERE th.sc_id =' . $fetch['sc_id'] . ' AND th.archived = 0

$fetch['sc_id'] 部分工作正常,是一个数值。

我得到的错误是:

Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1582 Incorrect parameter count in the call to native function 'ISNULL' in C:\xampp\htdocs\goatbb\pages\home.php:39 Stack trace: #0 C:\xampp\htdocs\goatbb\pages\home.php(39): PDO->query('SELECT *, count...') #1 C:\xampp\htdocs\goatbb\index.php(72): include('C:\\xampp\\htdocs...')

我想要的是当我执行这个查询时idFix返回最后发布的用户ID,所以与lastdate的原理相同,查询的那部分工作正常,但现在它也需要使用用户 ID 而不是日期。

我已经在 SO 上进行了搜索,但由于某种原因,当我尝试这些问题的解决方案时,它对我不起作用。


我稍微编辑了查询,我将不工作的部分更改为:

CASE WHEN IFNULL(po.u_id, 0) THEN po.u_id ELSE th.u_id END AS idFix

我现在遇到的问题是,当我发布某些内容时它会起作用,但是当我对帖子做出反应时,它总是会采用该值。

所以现在我需要检查数据库中最后插入的内容,我认为我必须执行与 lastdate 部分类似的操作,但我不知道该怎么做。

【问题讨论】:

  • ISNULL 只接受 1 个参数并返回一个布尔值;你可能想要IFNULL(a,b)(见this question)。
  • 您的查询有很多问题。您正在进行聚合,然后使用SELECT *。这是非常糟糕的做法,并且基本上没有意义,因为您的查询只返回一行(并且可能有多行)。修复查询并解释您要执行的操作。

标签: php mysql mariadb


【解决方案1】:

您的查询有很多问题。您正在进行聚合,然后使用SELECT *。这是非常糟糕的做法,而且基本上没有意义,因为您的查询只返回一行(并且可能有多行)。

此外,前两个计数很可能返回相同的值。我猜你想要COUNT(DISTINCT)

根据您的描述,我希望查询看起来更像这个简单的聚合:

SELECT COUNT(DISTINCT th.t_id) AS threadCount,
       COUNT(DISTINCT po.p_id) as postCount,
       MAX(GREATEST(po.u_id, th.u_id)) as idFix, 
       MAX(po.postdate) lastdate
FROM thread th LEFT OUTER JOIN
     threadpost po
     ON th.t_id = po.t_i
 WHERE th.sc_id =' . $fetch['sc_id'] . ' AND th.archived = 0;

但是,我不确定这正是您想要的逻辑,因为没有很好地解释。

【讨论】:

  • 我想要的是,如果threadpost 中没有结果,则采用thread 的结果,如果threadpost 中有结果,则将其作为idFix。请不要删除SELECT *,我有它是有原因的。
  • 另外,threadCountpostCount 工作正常,无需添加您所做的。查询工作正常,没有我在 OP 中所述的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2021-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多