Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何解决在单个大小写表达式中选择多个列的问题_Mysql_Sql - Fatal编程技术网

Mysql 如何解决在单个大小写表达式中选择多个列的问题

Mysql 如何解决在单个大小写表达式中选择多个列的问题,mysql,sql,Mysql,Sql,我想知道是否有任何方法可以根据if语句的结果选择两列 到目前为止,我已经把不必要的东西减半了: ( SELECT IF( (SELECT g.id FROM users AS u INNER JOIN user_groups AS g ON (g.id = u.group_id) WHERE u.id = 2) >= 4, (SE

我想知道是否有任何方法可以根据if语句的结果选择两列

到目前为止,我已经把不必要的东西减半了:

  ( SELECT IF(
               (SELECT g.id
                FROM users AS u
                INNER JOIN user_groups AS g ON (g.id = u.group_id)
                WHERE u.id = 2) >= 4,

               (SELECT p.action, p.id
                FROM permissions AS p
                WHERE p.required_points <=
                    (SELECT reputation
                     FROM users
                     WHERE id = 2)),

               (SELECT 0, 0)))
基本上,是否存在行为类似于if语句的多列操作数?如果是这样,我将如何实施它们。任何资源链接都将不胜感激

错误是:

1241-操作数应包含1列

整个sql查询:

(SELECT p1.action,
          p1.id
   FROM user_permissions AS u1
   INNER JOIN permissions AS p1 ON (p1.id = u1.action_id)
   WHERE u1.user_id = 2)
UNION
  (SELECT p2.action,
          p2.id
   FROM users AS u2
   INNER JOIN user_groups AS g ON (g.id = u2.group_id)
   INNER JOIN group_permissions AS gp ON (gp.group_id = g.id)
   INNER JOIN permissions AS p2 ON (p2.id = gp.action_id)
   WHERE u2.id = 2)
UNION
  ( SELECT IF(
               (SELECT g2.id
                FROM users AS u3
                INNER JOIN user_groups AS g2 ON (g2.id = u3.group_id)
                WHERE u3.id = 2) >= 4,
               (SELECT p3.action, p3.id
                FROM permissions AS p3
                WHERE p3.required_points <=
                    (SELECT reputation
                     FROM users
                     WHERE id = 2)),
               (SELECT 0, 0)))

哦,这基本上就是整个查询。这行不通:

SELECT IF( (SELECT g2.id
            FROM users u3 INNER JOIN
                 user_groups AS g2
                 ON g2.id = u3.group_id
            WHERE u3.id = 2) >= 4,
           (SELECT p3.action, p3.id
            FROM permissions AS p3
            WHERE p3.required_points <= (SELECT reputation FROM users WHERE id = 2)),
           (SELECT 0, 0)))
如果您确实不希望该行包含0,0,但它只是存在,因此存在其他值,那么让join或where将其过滤掉:

SELECT p3.action, p3.id
FROM (SELECT p3.action, p3.id
      FROM permissions AS p3
      WHERE p3.required_points <= (SELECT reputation FROM users WHERE id = 2))
     ) p3
WHERE (SELECT g2.id
       FROM users u3 INNER JOIN
            user_groups AS g2
            ON g2.id = u3.group_id
       WHERE u3.id = 2
      ) >= 4

你必须重复if语句。但是,如果你展示了你的全部查询或者简化的版本,可能有一种更简单的表达这个逻辑的方法。我确实考虑过,但是我不喜欢一个几乎完全复制的IF块的外观,所以假设必须有一个更好的方法。我现在就发布整个sql,希望能有所帮助。哦,谢谢,很抱歉回复太晚。我真的没有想过以这种方式使用子查询。
SELECT p3.action, p3.id
FROM (SELECT p3.action, p3.id
      FROM permissions AS p3
      WHERE p3.required_points <= (SELECT reputation FROM users WHERE id = 2))
     ) p3
WHERE (SELECT g2.id
       FROM users u3 INNER JOIN
            user_groups AS g2
            ON g2.id = u3.group_id
       WHERE u3.id = 2
      ) >= 4