【问题标题】:SELECT from different 3 tables with one SQL query使用一个 SQL 查询从不同的 3 个表中选择
【发布时间】:2015-11-12 00:18:28
【问题描述】:

我正在尝试使用 SQL 查询从帖子中获取一些具有角色的用户 - 订阅者、两种帖子类型的数量和一个元值:

SELECT 
SUM(CASE WHEN meta_key='wp_capabilities' AND meta_value LIKE '%subscriber%' THEN 1 ELSE 0 END) AS users,
SUM(CASE WHEN post_type='post' AND post_status='publish' THEN 1 ELSE 0 END) AS posts,
SUM(CASE WHEN post_type='updates' AND post_status='publish' THEN 1 ELSE 0 END) AS updates, meta_value AS version 
FROM wp_usermeta,wp_posts,wp_postmeta WHERE meta_key='content_version' AND post_id=1

没有结果并显示错误“#1052 - 字段列表中的列'meta_key'不明确”

任何人都可以帮助我做错了吗?

我想要得到的结果视图应该是这样的:

| users |  posts  |  updates  |  version  |
-------------------------------------------
|   2   |    5    |    2      |     1     |

谢谢

更新:

当我使用表别名更新查询时:

SELECT 
SUM(CASE WHEN a.meta_key='wp_capabilities' AND a.meta_value LIKE '%subscriber%' THEN 1 ELSE 0 END) AS users,
SUM(CASE WHEN b.post_type='post' AND b.post_status='publish' THEN 1 ELSE 0 END) AS posts,
SUM(CASE WHEN b.post_type='updates' AND b.post_status='publish' THEN 1 ELSE 0 END) AS updates, c.meta_value AS version 
FROM wp_usermeta AS a, wp_posts AS b, wp_postmeta AS c WHERE c.meta_key='content_version' AND post_id=1

它带来了错误的结果,似乎 SUM 正在计算表中的每条记录。以前有人遇到过这个问题吗?我正在使用 5.5.44-MariaDB

【问题讨论】:

  • ambiguous 表示列名出现在两个表中。将表名添加到对 meta_key 的每个引用。例如 WHERE wp_usermeta.meta_key='content.....
  • 嗨@johnelemans 它为所有结果带来NULL,但肯定有数字
  • 逐部分构建查询。做第一个总和以确保它有效。然后添加第二部分。等等。它在哪个部分失败了?
  • 一旦出现:SUM(CASE WHEN wp_usermeta.meta_key='wp_capabilities' AND wp_usermeta.meta_value LIKE '%subscriber%' THEN 1 ELSE 0 END) AS users

标签: wordpress mariadb


【解决方案1】:

对于 1052 错误,它只是说在它搜索表之后,它不知道您的列应该来自哪个表,因为该列名出现在多个表中。

在您的情况下,您有 3 张桌子。您需要使用您头脑中但不在我的数据库引擎头中的表来限定 meta_key 列(因为它在那里不明确)。

如果这意味着在列名前面加上tablename.(点)或别名点,那么这就是要走的路。顺便说一句,这总是要走的路。

可能是在更正一列之后,您会遇到下一个错误。相应地进行。

编辑: 你想看一个例子,见下文。

create table car
(   -- a particular car on the lot, not a make and model in general
    id int auto_increment primary key,
    carId int not null, -- this is a lookup in some other table to identify year/make/model (non unique)
    paintId int not null, -- as this is a particular car, it has a particular color !
    category varchar(20), -- lease, for-sale, demo, dumpItFast, etc
    price int not null
    -- Foreign Key constraints not shown such as carId and paintId
    -- other indexes not shown
);

create table paint
(   id int auto_increment primary key,
    name varchar(20) not null,
    category varchar(50) -- metallic, undercarriage, matte, clear coat
);

select id,category,price,name
from car
join paint
on paint.id=car.paintId

错误代码:1052。字段列表中的“id”列不明确

select car.id,category,price,name
from car
join paint
on paint.id=car.paintId

错误代码:1052。字段列表中的“类别”列不明确

select car.id,car.category,price,name
from car
join paint
on paint.id=car.paintId

-- 那会成功

坦率地说,最好在所有列上使用别名,这样毫无疑问。否则下一个看到它的人,即使是你,也总是在猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多