【问题标题】:How to count matched rows with left joins and multiple where conditions如何计算具有左连接和多个 where 条件的匹配行
【发布时间】:2021-01-29 15:27:02
【问题描述】:

我正在尝试获取具有元值的帖子,其中帖子具有一些元值。 对于分页,我需要对与查询匹配的所有行进行计数,以便我可以将其划分为页面并提供给前端。 但我认为我在这里遗漏了一些基本概念,即使匹配更多行,我每次都会计数 1。

^ 这是我在 phpmyadmin 中运行后得到的结果

SELECT
    COUNT(*) AS total_rows,
    p.id,
    p.title,
    m.meta_key,
    m.meta_value
FROM
    posts p
LEFT JOIN meta m ON
    p.id = m.object_id AND m.table_name = "post"
WHERE
    m.meta_key = 'post_taxonomy' AND m.meta_value = 'banner' AND p.post_type = 'post'
GROUP BY
    p.id

但我想要类似下面的截图

【问题讨论】:

  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。
  • Left Join With Where Clause 的副本这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。如果您发布问题,请使用一个措辞作为标题。
  • 无论您遇到什么其他问题,您都在使用 left join & where 在重复链接中描述的方式。--所以您可以将 left 更改为 inner & 总是得到相同的结果。因此,无论您遇到什么其他问题,您都无缘无故地使用 left 而不是 inner。这在答案中进行了解释。其他问题请参阅我的下一条评论,重复上面的第一条评论。不对该评论采取行动是关闭帖子的另一个原因。当您采取行动时,您的问题将是另一个常见问题。不欢迎你没有理由这么想。请自学网站的运作方式。 help center
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: php mysql sql join


【解决方案1】:

试试这个:

SELECT 
  COUNT(p.id) as count 
FROM (
  SELECT
      p.id,
      p.title,
      m.meta_key,
      m.meta_value
  FROM
      posts p
  LEFT JOIN meta m ON
      p.id = m.object_id AND m.table_name = "post"
  WHERE
      m.meta_key = 'post_taxonomy' AND m.meta_value = 'banner' AND 
      p.post_type = 'post'
) t

【讨论】:

  • 哦,这行得通,只是为了我的进一步改进,您对此类查询的性能有何看法?
  • 这取决于您的数据库设置。对其进行一些测试,看看哪种方法最适合您。
【解决方案2】:

首先,只需在select 中运行COUNT(*)

其次,LEFT JOIN 是多余的; WHERE 子句将其转换为 INNER JOIN。所以,你最好有清晰的 SQL。

所以:

SELECT COUNT(*)
FROM posts p JOIN
     meta m
     ON p.id = m.object_id AND m.table_name = 'post'
WHERE m.meta_key = 'post_taxonomy' AND
      m.meta_value = 'banner' AND 
      p.post_type = 'post';

另外,用单引号而不是双引号将字符串括起来。单引号是分隔字符串的 SQL 标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2021-07-21
    • 2019-01-17
    • 2016-08-31
    相关资源
    最近更新 更多