【问题标题】:MySQL - Operand should contain 1 column(s)MySQL - 操作数应包含 1 列
【发布时间】:2012-12-12 09:08:02
【问题描述】:

在我正在创建的系统上工作时,我尝试在我的项目中使用以下查询:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id

":cat" 在我使用 PDO 时受我的 PHP 代码的约束。 2 是 ":cat" 的有效值。

该查询给了我一个错误:“#1241 - 操作数应包含 1 列”

让我难过的是,我认为这个查询不会有问题。选择列,然后从另一个表中再选择两个,然后从那里继续。我就是想不通是什么问题。

是否有一个简单的解决方法,或另一种方式来编写我的查询?

【问题讨论】:

    标签: mysql sql mysql-error-1241


    【解决方案1】:

    您的子查询正在选择两列,而您正在使用它来投影一列(作为外部SELECT 子句的一部分)。在此上下文中,您只能从此类查询中选择一列。

    考虑改为加入users 表;这将使您在从users 中选择所需的列时更加灵活。

    SELECT
    topics.id,
    topics.name,
    topics.post_count,
    topics.view_count,
    COUNT( posts.solved_post ) AS solved_post,
    users.username AS posted_by,
    users.id AS posted_by_id
    
    FROM topics
    
    LEFT OUTER JOIN posts ON posts.topic_id = topics.id
    LEFT OUTER JOIN users ON users.id = posts.posted_by
    
    WHERE topics.cat_id = :cat
    GROUP BY topics.id
    

    【讨论】:

    • 感谢您的回复。我将修复我的查询,并将您标记为答案,但只是为了输入,您是否认为有比我现在使用的“更好”的方式来编写我的查询(但也忽略其中的错误)?
    • 啊。感谢您对原始帖子的编辑。当 StackOverflow 允许我时,我一定会把你标记为答案。非常感谢!
    • 好吧,COUNT() 有点搞砸了;由于聚合,我给出的查询可能会出错。您可能需要将该聚合移动到子查询中,具体取决于查询的目标(目前我还不清楚)。
    【解决方案2】:

    如果您不小心在JOINON 子句中使用了逗号而不是AND,也会出现此错误:

    JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                            ^
                                                 should be AND, not a comma
    

    【讨论】:

    • 这真的为我节省了很多时间。谢谢!
    【解决方案3】:

    如果您在WHERE 子句中不小心使用了= 而不是IN,也会出现此错误:

    例如:

    WHERE product_id = (1,2,3);
    

    【讨论】:

    • 或 LIKE 而不是 IN 就像我做的那样,但找不到发生此错误的原因。 ty 为指针。
    • 如果您在 SELECT 子句中的字段周围加上括号,也会发生这种情况,例如从表中选择(字段 1、字段 2)
    【解决方案4】:

    就我而言,问题是我错误地将我的列选择用括号括起来:

    SELECT (p.column1, p.column2, p.column3) FROM table1 p WHERE p.column1 = 1;
    

    而且必须是:

    SELECT p.column1, p.column2, p.column3 FROM table1 p WHERE p.column1 = 1;
    

    听起来很傻,但它导致了这个错误,花了一些时间才弄清楚。

    【讨论】:

    • 我不敢相信这是我的问题,我认为括号在那里是合法的
    【解决方案5】:
    COUNT( posts.solved_post ) AS solved_post,
    (SELECT users.username AS posted_by,
        users.id AS posted_by_id
        FROM users
        WHERE users.id = posts.posted_by)
    

    嗯,你不能像这样从一个子查询中获取多个列。幸运的是,第二列已经是posts.posted_by!所以:

    SELECT
    topics.id,
    topics.name,
    topics.post_count,
    topics.view_count,
    posts.posted_by
    COUNT( posts.solved_post ) AS solved_post,
    (SELECT users.username AS posted_by_username
        FROM users
        WHERE users.id = posts.posted_by)
    ...
    

    【讨论】:

      【解决方案6】:

      如果你不小心错过了if函数名,也会出现这个错误。

      例如:

      set v_filter_value = 100;
      
      select
          f_id,
          f_sale_value
      from
          t_seller
      where
          f_id = 5
          and (v_filter_value <> 0, f_sale_value = v_filter_value, true);
      

      当我错过将 if 放入 if 函数时遇到了这个问题!

      【讨论】:

        【解决方案7】:

        我在 Intellij 控制台中执行 MySQL 脚本时遇到此错误,因为在错误的位置添加了括号:

        错误:

        SELECT user.id
        FROM user
        WHERE id IN (:ids); # Do not put brackets around list argument
        

        右:

        SELECT user.id
        FROM user
        WHERE id IN :ids; # No brackets is correct
        

        【讨论】:

        【解决方案8】:

        另一个可能发生此错误的地方是分配一个在字符串之外有逗号的值。例如:

        SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
        

        【讨论】:

          【解决方案9】:
          (SELECT users.username AS posted_by,
          users.id AS posted_by_id
          FROM users
          WHERE users.id = posts.posted_by)
          

          在这里您使用子查询,但此子查询必须只返回一列。 分开,否则会报错。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-20
            相关资源
            最近更新 更多