【问题标题】:SQL - Ordering table with subquery for selectSQL - 带有用于选择的子查询的排序表
【发布时间】:2022-01-18 12:26:08
【问题描述】:

我正在尝试使用来自uuidname 的子查询对查询进行排序。让我们在 MySQL 中拥有这两个表:

禁令:

id uuid time reason
1 c6b8eade-7db9-345b-b838-8f8361552cf5 1642369382 Test
2 0138c279-c5fa-3acd-adaa-8edb7b4569d8 1642384565 Spam
3 3c01262c-a3c3-3133-ba43-92a9ded01c27 1631876477 Hax

用户:

id uuid name
45 c6b8eade-7db9-345b-b838-8f8361552cf5 John
100 0138c279-c5fa-3acd-adaa-8edb7b4569d8 Mike
35 3c01262c-a3c3-3133-ba43-92a9ded01c27 Norman

通过这个查询,我可以选择整个ban 记录 + 从users 表中获取用户的name

SELECT
    bans.*,
    (SELECT users.name FROM users WHERE users.uuid = bans.uuid) as name
FROM bans
ORDER BY :column;

但我无法通过name 订购。如何更改此查询以便我可以通过users.name 进行订购?我试图将我的 SQL 选择包装到另一个选择中,但它不起作用,我无法解决它:D

【问题讨论】:

  • 不能将列名或表名设为参数
  • 你需要一个 JOIN 而不是一个子查询
  • 只是占位符。我从我的 PHP PDO 查询中复制了它
  • 可以,但不能将列名设为参数

标签: mysql sql subquery sql-order-by


【解决方案1】:

如果我见过,那就是一个 JOIN 查询。

您不能在 PDO 或 MYSQLI 中将表名或列名作为参数传递。数据库无法编译和优化包含未知列或表的代码

SELECT b.*, u.name
FROM bans b
    LEFT JOIN users u ON u.uuid = b.uuid
ORDER BY u.name;

【讨论】:

    【解决方案2】:

    也许你可以试试这个

    select a.id, a.uuid, a.time, a.reason, b.name from bans a
    left join users b
    on a.uuid = b.uuid
    order by b.name;
    

    【讨论】:

    • 让你的别名至少与你正在使用的别名有关
    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2018-01-21
    • 1970-01-01
    • 2020-10-29
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多