【问题标题】:Merging these two queries合并这两个查询
【发布时间】:2012-09-02 13:57:16
【问题描述】:

我将这两个查询单独列出,但现在我需要将结果放在同一个列表中。

现在我通过使用 javascript 按 id 排序项目来“修复”它。但如果能从服务器合并这些数据会很棒,这样我就可以对结果进行分页了..

数据库架构

桌友:

表格帮助

查询 A(返回当前用户的结果)

   $sql = 'SELECT * FROM helps WHERE id_user ='.$value;

查询 B(返回当前用户的朋友的结果)

$sql = 'SELECT
    h.*,
    f.* 
    FROM (
            SELECT
                     id  AS friendsId,
                     CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
                        FROM friends
                        WHERE acepted = 1
                        AND (followerid  = '.$value.' OR followingid = '.$value.')
                    ) AS f
                        INNER JOIN helps AS h ON h.id_user = f.friend_id
                        ORDER BY h.id DESC';

有没有办法合并这些查询?老实说,我不知道该怎么做。

-编辑-

考虑联合,但我不知道如何按事物处理订单..

$sql = '(SELECT * FROM helps WHERE id_user = '.$value.')
                    UNION
                    (SELECT
                                h.*,
                                f.* 
                            FROM (
                                SELECT
                                    id  AS friendsId,
                                    CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
                                FROM friends
                                WHERE acepted = 1
                                AND (followerid  = '.$value.' OR followingid = '.$value.')
                            ) AS f
                                INNER JOIN helps AS h ON h.id_user = f.friend_id
                                ORDER BY h.id DESC)';

正如您在第二个查询中看到的,帮助表已重命名为 h。我怎样才能在第一次做同样的事情? (两个查询都以相同的格式返回数据)

【问题讨论】:

  • 请在此上下文中定义“合并”
  • 如果您可以包含表的架构会更好。也许有比使用UNION更好的方法。
  • @ToniMichelCaubet 在下面尝试我的答案。

标签: mysql sql merge


【解决方案1】:

要合并这两个查询和订单记录的结果,您需要使用UNION ALLGROUP BY。试试这个查询:

SELECT h.id AS id, h.title, h.content, id_user, h.id_group,
       h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
       h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
       MAX(h.fid) AS fid, MAX(h.friend_id) AS friend_id
FROM (   
      SELECT h.id AS id, h.title, h.content, id_user, h.id_group,
             h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
             h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
             0 AS fid, 0 AS friend_id
      FROM helps h
      WHERE h.id_user ='.$value.'

      UNION ALL

      SELECT h.id, h.title, h.content, id_user, h.id_group,
             h.id_type, h.id_lic, h.avatar, h.attached, h.attached,
             h.fetcha, h.likes, h.lan, h.needsCount, h.receivedCount,
             f.id AS fid, f.friend_id
      FROM (
             SELECT id  AS friendsId,
                    CASE followerid WHEN '.$value.' THEN followingid
                                    ELSE followerid
                    END AS friend_id
             FROM friends
             WHERE acepted = 1
                   AND (followerid  = '.$value.' OR followingid = '.$value.')
            ) AS f
            INNER JOIN helps AS h
                ON h.id_user = f.friend_id
     ) h
GROUP BY h.id
ORDER BY h.id DESC;

【讨论】:

  • 谢谢我会测试并告诉你
  • “字段列表”中的未知列“h”
  • “字段列表”中的未知列“f.id”
【解决方案2】:

UNION的基本规则是

  • 每个查询返回的列数必须相等且
  • 数据类型必须相互匹配。

如您所见,我没有修改您制定的查询。只是我为每个查询添加了一个 Virtual Column。此列将用于对所有记录进行排序。查询由另一个select statment 包装,因此虚拟列不会显示在结果列表中,但它将是对记录进行排序的基础。下面的查询结果包含最顶部的用户记录(因为ORDER BY OrderBy ASC),然后是按好友 ID 排序的用户好友记录。如果您想要任何澄清,请通知我。还有一件事,我在您的第二个查询中删除了f.*,因为这不是必需的,并且可能由于列 (number) 不匹配而导致您的语法错误。

SELECT  ID, Title, Content, ID_User, ID_Group, 
        ID_Type, ID_Loc, Avatar, Attached, Fecha, Likes, 
        Lan, NeedsCount, RecivedCount
FROM
    (
        SELECT *, 1 as OrderBy           -- first query you formulated
        FROM helps 
        WHERE id_user = '.$value.'
        UNION
        SELECT  h.*, 2 as OrderBy        -- second query you formulated
        FROM    (
                    SELECT  id  AS friendsId,
                            CASE followerid 
                                WHEN '.$value.' THEN followingid 
                                ELSE followerid 
                            END AS friend_id
                    FROM    friends
                    WHERE   acepted = 1 AND 
                            (followerid  = '.$value.' OR followingid = '.$value.')
                ) AS f
                    INNER JOIN helps AS h 
                        ON h.id_user = f.friend_id
    ) x
ORDER BY OrderBy ASC, ID DESC

【讨论】:

  • 您好,但我不想重命名字段,相同的函数会读取结果...
  • @ToniMichelCaubet 实际上没有在查询中重命名的字段:D
  • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 3 行的 '' 附近使用很难说...
  • 重命名为字段实名和作品! SELECT id, title, content, id_user, id_group, id_type, id_loc, avatar, attach, fecha, likes, lan, needsCount, recivedCount FROM
  • 是的!这实际上就是我在第一条评论中所说的。重命名的字段。谢谢!
【解决方案3】:

如果两个查询的结果集相似,请尝试 UNION 运算符

【讨论】:

【解决方案4】:

像 Omesh 描述的那样做一个 UNION,然后处理排序,这样做:

SELECT * FROM
(
    ....Omesh's code....
) T
ORDER BY T.id DESC

【讨论】:

  • 同样的问题...“字段列表”中的未知列“h”
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2011-06-28
相关资源
最近更新 更多