【问题标题】:SQL - group by another SQL statement with multiple rowsSQL - 由具有多行的另一个 SQL 语句分组
【发布时间】:2019-07-29 08:04:37
【问题描述】:

我正在尝试通过对不同的元列进行分组来让 wordpress 工作的 SQL 语句。

我有一张带有投票的表格,一张带有位置的表格和一张带有指向某些城市的参考链接的表格(每个城市可以包含多个位置)。

我正在尝试根据每个大城市对所有选票进行分组,但是我在将两个 SQL 语句合二为一时遇到了一些麻烦。

这是获得票数排名前 50 位的查询:

SELECT Count(*) as Amount, meta.meta_value as Location FROM wp_votes as votes
LEFT JOIN wp_postmeta as meta ON votes.`post_id` = meta.`post_id`
WHERE meta.meta_key = 'location'
AND votes.`post_id` IS NOT NULL AND votes.`post_id` <> 0
GROUP BY meta.meta_value
ORDER BY Amount DESC
LIMIT 50;

这会返回如下响应:

|---------------------|------------------|
|      Amount         |     meta_value   |
|---------------------|------------------|
|       1250          |      Brooklyn    |
|---------------------|------------------|
|       400           |     Manhattan    |
|---------------------|------------------|
|       300           |     Chicago      |

这是根据位置获取城市的查询。它返回一个城市列表(在上面的示例中,它只返回纽约)并且“布鲁克林”、“曼哈顿”这两个位置将被“包括”在纽约。

SELECT meta_value FROM wp_posts as location
LEFT JOIN wp_postmeta as city ON city.`post_id` = location.`ID`
WHERE city.`meta_key` = 'reference'
GROUP BY city.`meta_value`;

这里的想法是将这两个查询映射在一起,这样如果第一个查询的位置与第二个查询的位置匹配,它将改为按城市名称对行进行分组。

所以组合查询的输出将是:

|---------------------|------------------|
|      Amount         |     meta_value   |
|---------------------|------------------|
|       1650          |      New York    |
|---------------------|------------------|
|       300           |     Chicago      |
|---------------------|------------------|

这可能吗?

【问题讨论】:

  • LEFT JOIN 返回常规的INNER JOIN 结果,因为您在WHERE 子句中有外部表条件。将城市条件移至ON 子句以获得真正的LEFT JOIN 结果。

标签: mysql sql database wordpress


【解决方案1】:

只需添加第二个JOIN 即可获得参考:

SELECT c.meta_value as city, Count(*) as Amount 
FROM wp_votes v LEFT JOIN
     wp_postmeta l
     ON v.`post_id` = l.`post_id` AND
        l.meta_key = 'location' LEFT JOIN
     wp_postmeta c
     ON l.id = c.`post_id` AND
        c.meta_key = 'city'
WHERE v.`post_id` IS NOT NULL AND v.`post_id` <> 0
GROUP BY c.meta_value
ORDER BY Amount DESC
LIMIT 50;

【讨论】:

  • 感谢您的回答!虽然,在运行此查询时,我只得到一个包含所有投票结果的单行。问题可能是第二个查询中的位置和城市是单独的条目(即未链接到第一个查询中的帖子)。所以我需要检查第一个查询中的位置值是否与第二个查询中的任何位置值匹配,然后进行排序
  • @user2868900 。 . .数据模型似乎有问题,因为您将post_id 用于不同的目的。无论如何,这可以通过调整JOIN 条件来解决。
  • 由于这是一个 wordpress 站点,数据模型变得非常混乱,并且添加的功能基于高级自定义字段和前端功能,而不是实际的数据模型。谢谢,我会努力让它工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2017-10-31
  • 2020-12-13
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多