【问题标题】:Expanding mySQL query to include more content扩展 mySQL 查询以包含更多内容
【发布时间】:2010-01-03 00:41:39
【问题描述】:

我有一个 MySQL 查询,它选择当前用户的朋友创建的内容并按时间倒序列出该内容。

    SELECT node.nid AS nid,
   node.created AS node_created
 FROM node node 
 LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requestee_id
 LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid
 WHERE (node.status <> 0) AND (node.type in ('drigg', 'blog_post')) AND (user_relationships.requester_id = 1)
   ORDER BY node_created DESC

我如何“扩展”这个查询,以便它列出除了节点之外的 cmets?

这是评论表的结构:

  • cid(评论 ID)
  • uid(发表评论的用户 ID)
  • 时间戳(使用相同的 UNIX 日期 格式为“节点创建”列 从上面的节点表)

所以现在查询会抓取当前用户的好友所写的所有“节点”。我希望它还可以获取当前用户的好友编写的所有 cmets。然后我想根据它们的创建日期按 DESC 顺序列出这些节点和 cmets。

看来我需要在我的 select 语句中添加更多内容,但我不确定是什么。

【问题讨论】:

  • 您只选择了两列(node.nid、node.created)。我是否希望将此选择增加到三列:(node_id,comment_id,created)对于每一行,只有一个(node_id,comment_id)设置?与节点和评论相关的其他数据,例如文本正文呢?你不应该也拿那个吗?还是您在单独的查询中获取它?
  • 我们也可以获取这些东西。我只是想让我的问题简单。我想如果我能得到一个节点和评论 ID 的反向时间顺序列表,那么我就可以弄清楚如何将它们变成完整的故事和 cmets。不想问这么棘手的问题,没有人回答。
  • @bflora:我很高兴听到这个消息。我担心你只会返回所有 id,然后通过循环和进行新查询来获取其余数据。让问题保持简单是一件好事,但我总是很想知道更多关于问题背后的背景,以确保没有更简单的方法来解决问题,这就是我问的原因。
  • @bflora:我也很想通过创建两个单独的有序查询(一个用于节点,一个用于 cmets)并在客户端合并结果来解决这个问题。您是否考虑过这种方法是否可行?它可能更简单、更清晰——您可以为 cmets 和节点重用现有的类,并且结果集中不会有大量的 NULL。缺点当然是到服务器的额外往返。
  • 好吧,这有点超出我的想象,不幸的是。目前,我在赌我将能够弄清楚如何为此添加分页和其他 Drupal-y 位。问你是否愿意加入 IRC 来做更多的工作?

标签: sql mysql drupal


【解决方案1】:

您可以使用 UNION ALL 来组合两个查询的结果:

SELECT nodeid, commentid, created FROM (
    SELECT node.nid AS nodeid, NULL as commentid, node.created AS created
    FROM node node 
    LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requestee_id
    LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid
    WHERE (node.status <> 0) AND (node.type in ('drigg', 'blog_post')) AND (user_relationships.requester_id = 1)
    UNION ALL
    SELECT NULL as nodeid, comment.cid AS commentid, comment.timestamp AS created
    FROM node node 
    LEFT JOIN user_relationships user_relationships ON node.uid = user_relationships.requestee_id
    LEFT JOIN users users_user_relationships ON user_relationships.requestee_id = users_user_relationships.uid
    WHERE (node.status <> 0) AND (node.type in ('drigg', 'blog_post')) AND (user_relationships.requester_id = 1)
)
ORDER BY created DESC

【讨论】:

    【解决方案2】:

    所以现在查询会抓取当前用户的好友所写的所有“节点”。我希望它还可以获取当前用户的好友编写的所有 cmets。然后我想根据它们的创建日期按 DESC 顺序列出这些节点和 cmets。

    用途:

       SELECT n.nid,
              COALESCE(c.timestamp, n.created) AS coalesced_timestamp,
              c.comment
         FROM NODE n
    LEFT JOIN USER_RELATIONSHIPS ur ON ur.requestee_id = n.uid
    LEFT JOIN USERS u ON u.uid = ur.requestee_id
    LEFT JOIN COMMENT c ON c.uid = u.uid
                       AND c.nid = n.nid
        WHERE n.status <> 0 
          AND n.type in ('drigg', 'blog_post') 
          AND ur.requester_id = 1
     ORDER BY coalesced_timestamp DESC
    

    那是based on the ERD listed here。

    拥有相同或比表名本身更长的表别名没有多大意义。

    【讨论】:

    • 不需要的表别名很好。如果我理解您的查询,但我认为它只会列出用户在他们也创建的节点上创建的 cmets。也许 bflora 还希望用户在他们没有创建的节点上创建 cmets?我不知道drupal,所以我不知道这是否可能。
    • 标记是正确的。我想从这个查询中的节点“解耦”cmets。我想要当前用户的好友创建的最新 cmets 和节点的列表。通过这种方式,用户可以看到他的好友发布和评论的内容,并可以找到新内容。在 Drupal 的 Views 模块中四处寻找之后,它似乎无法在同一查询中返回 cmets 和节点的列表,因此滚动了自定义查询。 Drupal 非常擅长让您列出节点。我只是希望我可以在同一个查询中包含从上下文中删除的 cmets。
    • 根据澄清更新。
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多