2010-01-03 22 views
1

我有一个MySQL查询,选择由当前用户的朋友创建的内容,并按反向时间顺序列出该内容。扩展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 

如何“展开”此查询,以便除列出节点外还列出注释?

这里的评语表的结构:

  • CID(注释ID)
  • UID(用户ID谁张贴评论)
  • 时间戳(使用相同的UNIX日期 格式“节点创建“列 上面的节点表)

所以现在查询抓取所有的”节点“写的人与朋友是谁 当前用户。我希望它能够抓取当前用户的好友所写的所有评论。然后我想根据它们的创建日期以DESC顺序列出这些节点和评论。

它似乎我需要添加更多的东西到我的选择语句,但我不知道是什么。

+0

您只选择了两列(node.nid,node.created)。我是对的,你想增加这个选择三列:(node_id,comment_id,创建)在每一行,只有一个(node_id,comment_id)被设置?关于与节点和评论相关的其他数据如何,如文本正文?你不应该那样吗?或者你是在单独的查询中获取它? – 2010-01-03 00:46:44

+0

我们也可以提取那些东西。我只是想保持简单的问题。我想如果我能够以反时序的方式获得节点和评论ID的列表,那么我可以弄清楚如何将这些转化为完整的故事和评论。不想问这么棘手的问题,没有人回答。 – bflora2 2010-01-03 01:11:15

+0

@bflora:我很高兴听到这个消息。我担心你只会返回所有的id,然后通过循环和新的查询来获取其余的数据。保持简单的问题是一件好事,但我总是很想知道更多关于问题背后的背景知识,以确保没有更简单的方法来解决问题,这就是我问的原因。 – 2010-01-03 01:21:43

回答

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 
1

所以现在查询抓住的人谁是当前用户的好友写所有的“节点”。我希望它能够抓取当前用户的好友所写的所有评论。然后我想根据它们的创建日期以DESC顺序列出这些节点和评论。

用途:

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

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

+0

好一点与不必要的表别名。如果我理解你的查询,但我认为它只会列出用户在他们创建的节点上所做的评论。也许bflora也希望用户在他们没有创建的节点上发表评论?我不知道Drupal,所以我不知道这是否可能。 – 2010-01-03 01:13:24

+0

马克是正确的。我想在此查询中“解耦”来自节点的注释。我想要一个由当前用户的好友创建的最新评论和节点的列表。这样用户可以看到他的好友发布和评论什么,并且可以找到新的东西。在Drupal的Views模块中查找后,似乎无法返回同一查询中的注释和节点列表,因此会滚动自定义查询。 Drupal非常擅长让你列出节点。我希望我可以在相同的查询中包含从其上下文中删除的评论。 – bflora2 2010-01-03 01:15:41

+0

根据澄清更新。 – 2010-01-03 01:28:28