【问题标题】:MYSQL UNION producing unexpected results and missing columnsMYSQL UNION 产生意外结果和缺少列
【发布时间】:2012-02-11 14:48:26
【问题描述】:

我想合并两个不同表的结果,它们唯一的共同点是一个名为 date_mod 的日期字段

下面的查询仅显示第一个 select 语句中的两列。 profile_id 列未显示。

关于如何调整它的任何帮助,以便我可以根据 date_mod 字段的顺序从两个表中获得 5 个最新结果。

SELECT resume_id,  date_mod FROM resumes  ORDER BY date_mod 
UNION ALL 
SELECT profile_id, date_mod FROM profiles ORDER BY date_mod LIMIT 5

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    显示了 profile_id,但一列只有一个标签 - 第一次选择的标签。

    SELECT resume_id as id,  date_mod as date, 'resume' as type FROM resumes
    UNION ALL 
    SELECT profile_id, date_mod, 'profile' FROM profiles 
    ORDER BY date 
    LIMIT 5
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT *
      FROM
          (SELECT resume_id as `ID`,  date_mod
          FROM resumes
               UNION
          SELECT profile_id as `ID`, date_mod
          FROM profiles) iResult 
      ORDER BY iResult.date_mod
      LIMIT 5
      

      【讨论】:

      • UNION 会触发不必要的隐式排序,因此UNION ALL 会更可取。否则,这正是我要发布的内容。
      【解决方案3】:

      我相信限制 5 会导致您可能应该包装查询的问题,即

      SELECT * FROM (SELECT resume_id,date_mod FROM resumes ORDER BY date_mod UNION ALL SELECT profile_id, date_mod FROM profiles ORDER BY date_mod) LIMIT 5
      

      这应该提供您正在寻找的内容

      【讨论】:

      • 感谢您的建议。由于 ORDER BY,我得到了一个错误,所以我尝试了一个简化的:SELECT * FROM (SELECT resume_id,date_mod FROM resumes UNION ALL SELECT profile_id, date_mod FROM profiles)。然而,这给了我一个“每张桌子都需要一个别名”的错误,我想试试看。
      【解决方案4】:

      您应该在合并基础上申请订单:

      (SELECT resume_id,  date_mod FROM resumes 
      UNION ALL 
      SELECT profile_id, date_mod FROM profiles ) ORDER BY date_mod LIMIT 5
      

      【讨论】:

        【解决方案5】:

        在执行 UNION 时,列必须具有相同的“别名”列结果和数据类型才能进行限定。如果您想要前 5 名,您实际上应该对 BOTH 组应用一个限制,以从双方获得最多 5 名。然后应用 OVERALL 限制 5,这样您就不会预先返回两个单独文件中的所有记录

        select 
              Source,
              SrcID,
              Date_Mod
           from
              ( SELECT 
                      "R" as Source,
                      resume_id as SrcID,
                      date_mod 
                   FROM 
                      resumes
                   ORDER BY 
                      date_mod 
                   LIMIT 5
                UNION ALL
                SELECT
                      "P" as Source,
                      profile_id as SrcID,
                      date_mod
                   FROM 
                      profiles 
                   ORDER BY 
                      date_mod 
                   LIMIT 5 ) PreQuery
           order by
              Date_Mod
           LIMIT 5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多