【问题标题】:MySQL query: Using UNION and getting row number as part of SELECTMySQL 查询:使用 UNION 并获取行号作为 SELECT 的一部分
【发布时间】:2011-05-25 09:45:58
【问题描述】:

我有一个联合查询如下:

(SELECT t.id, t.name, c.company AS owner, t.creation_date AS date, t.notes FROM 工具 t,客户端 c WHERE t.id_customer = '15' AND t.trash_flag = '1') 联盟 (SELECT f.id, f.name, CONCAT(m.first_name, ' ', m.last_name) AS 所有者, f.date, f.notes FROM 文件 f, 元 m WHERE ((f.acl = 0) OR (f.acl = 1 AND '1' = TRUE) OR (f.acl = 2 AND f.id = '7')) AND f.id = '15' AND f .trash_flag = '1' AND m.user_id = f.id_user) ORDER BY 'name' 'ASC' LIMIT 0,20 一切正常,但我有两个问题:
  1. 如何向整个结果集中添加一列以给出行号
  2. 我可以在不使用 UNION 的情况下执行此操作,例如高级加入?

感谢您的时间 MySQL 大师!

【问题讨论】:

    标签: mysql join union row-number


    【解决方案1】:

    我现在无法测试它,但根据我的发现,以下可能有效:

    参考:Row Number Variable

    SQL 语句

    SELECT  @rownum := @rownum + 1 rownum
            , t.*
    FROM    (
                (SELECT t.id
                        , t.name
                        , c.company AS owner
                        , t.creation_date AS date
                        , t.notes 
                FROM    tool t
                        , client c 
                WHERE   t.id_customer = '15' 
                        AND t.trash_flag = '1' 
                ) UNION (
                SELECT  f.id
                        , f.name
                        , CONCAT(m.first_name, ' ', m.last_name) AS owner
                        , f.date
                        , f.notes 
                FROM    file f
                        , meta m 
                WHERE   ((f.acl = 0) OR (f.acl = 1 AND '1' = TRUE) OR (f.acl = 2 AND f.id = '7')) AND f.id = '15' AND f.trash_flag = '1' AND m.user_id = f.id_user) 
                )
            ) t
            , (SELECT @rownum := 0) r
    ORDER BY 
            'name' ASC
    LIMIT   0, 20 
    

    【讨论】:

    • +1 ORDER BY name ASC LIMIT 0,20 可能意味着在外部选择中,但这是正确的。
    • 除了UNION ALL,还有一件事可以加快查询速度:您可以在子查询和外部查询中添加LIMIT 0,20
    • @ypercube,谢谢。您的更正和建议我已经执行。
    • @ypercube - 我已经从子查询中删除了 LIMIT。如果不对子查询进行排序,最终结果将与 OP 已有的结果不同。
    • 破解了(两个UNION都需要用括号括起来):SELECT @rownum:=@rownum+1 rownum, tt.* FROM ((SELECT t.id, t.name, c.company, t.creation_date, t.notes FROM tool t, client c WHERE (t.id_customer = '15'AND t.trash_flag = '1' AND t.id_client = c.id)) UNION (SELECT f.id_file, f.name_file, CONCAT( m.first_name, ' ', m.last_name ) AS owner, f.date_file, f.notes_file FROM file f, meta m WHERE (f.id_customer = '15'AND f.trash_file = '1'))) tt, (SELECT @rownum := 0) r ORDER BY name DESC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多