当前位置: 首页 > 知识库问答 >
问题:

从多个表中检索数据并将它们列在列表中

邓德惠
2023-03-14

我在从两个表中检索数据然后列出它们时遇到了一些问题。我想将用户的提要帖子和他们喜欢的活动全部列在一个列表中。

我想做的是:在活动墙中列出提要和类似用户的活动。

所以它应该输出如下(按时间戳desc排序):

  • “这是用户A的帖子”

我的当前SQL:

SELECT * FROM feeds,likes WHERE feeds.deleted!=0 or likes.deleted!=0 ORDER BY feeds.timestamp, likes.timestamp

然而,我的问题是我不知道如何链接这两个表,因为我的“feed”中的ID与“likes”中的ID不同

共有3个答案

司徒啸
2023-03-14

当你从feed中选择*时,就像 您正在隐式交叉连接两个表。引擎将把每个表中的每个记录与另一个表中的每个记录相结合。这远远不是你想要的。

我认为你也不应该“链接”两个表。粗略地说,你需要的是得到每一篇文章和每一个类似的东西,然后根据时间戳订购那一大套。

它听起来更像两个查询之间的UNION,以及应用于整个UNION的ORDER BY。顺便说一句,UNIONs对眼睛来说从来都不容易...

联合的问题是,两个子查询都需要返回相同数量的列。由于不知道您有哪些列,我将向您展示一种可能的解决方案:

SELECT activity, timestamp FROM (
   ( SELECT CONCAT(u.name,' posted ',f.content) as activity, timestamp
     FROM user u
     JOIN feed f on (f.user_id=u.id)
     WHERE f.deleted!=0
   ) UNION
   ( SELECT CONCAT(u.name, ' liked a post by ',u2.name) as activity, timestamp
     FROM user u
     JOIN likes l on (l.user_id=u.id)
     JOIN feed f on (l.feed_id=f.id)
     JOIN user u2 on (f.user_id=u2.id)
     WHERE l.deleted!=0
   )
) as whole_result
ORDER by timestamp desc

当然,您应该修改它以匹配您的结构。

希望这有帮助!

佟寒
2023-03-14

查询应该通过postID链接F=提要表,L=喜欢表,U1=用户可链接到拥有的提要,U2=用户可链接到喜欢表

 SELECT F.postTitle+' posted by '+ U1.username,'liked by'+U2.username  
 FROM likes L
 LEFT JOIN feeds F on (F.postID=L.postID)
 LEFT JOIN users U1 on (U1.userID=F.userID) 
 LEFT JOIN users U2 on (U2.userID=L.userID) 
 ORDER BY L.date,L.postID DESC
任元青
2023-03-14

要组合这两个集合,您可以使用UNION ALL集合运算符。

类似这样:

SELECT f.timestamp    AS `timestamp`
     , 'feed'         AS `src`
     , f.feed_id      AS `id`
     , f.feed_content AS `content`
  FROM feeds f
 WHERE f.deleted!=0
 UNION ALL
SELECT l.timestamp    AS `timestamp`
     , 'like'         AS `src`
     , l.like_id      AS `id`
     , l.note         AS `content`
  FROM likes l
 WHERE l.deleted!=0
 ORDER BY 1 DESC

请注意查询(在UNION ALL运算符的两侧)需要匹配,即返回的列数和每列的数据类型。

为了适应差异,例如从一个表返回的额外列,而不是从另一个表返回的额外列,可以添加文本表达式来代替“缺失”列。

额外的src列的返回是我们可以用来区分返回行的查询的一种方法。返回这样的列不是强制性的,但我经常发现这很有用。(如果对您的用例没有用处,可以从每个查询中删除src列。)

注意,也可以通过这种方式组合两个以上查询的结果,我们只需添加另一个UNION ALL和另一个查询。

组合结果集中的列名由第一个查询确定。第二个查询中的列名和别名被忽略。

排序依据应用于整个集合,并遵循最后一次选择。

 类似资料:
  • 我的sql表中有三列,“FirstName”、“MiddleName”、“LastName”。例如,检索时,我需要同时显示这3个 FirstName="John"MiddleName="Ned"LastName="Carter"。 检索时,这些文件应显示为“John Ned Carter”。 我尝试了以下方法 有个问题!!!有许多中间名为空的名称。有许多姓氏为空的名称,依此类推。这不是找回那些!!

  • 问题内容: 我正在尝试以android应用程序的形式创建一个小型课程聚合程序。 我的课程全部存储在Firebase实时数据库中,该数据库可从firebase控制台查看,并且一切正常。 问题是我已经编写了一个Java方法来连接到DB,从DB检索数据,将数据转换为Custom Java对象,将其附加到另一个Custom Java对象,然后将该对象保存到ArrayList中。 与数据库的连接已成功建立,

  • 我想知道是否有可能将不同流中的数据合并成一个流。通过合并,我的意思是将其添加到单独的列中,而不是添加到现有的列中。 到目前为止,我已经能够将数据收集到单独的地图中,如下面的示例所示。我认为我应该把这些地图合并成一张,但不确定如何去做,或者我是否做错了什么。 我做了一些搜索,在FlatMap、Concat等网站上找到了一些线索,但因为我对这条流还不熟悉 例如:列出数据-1

  • 我使用Java8 lambdas轻松筛选集合。但我没有找到一种简洁的方法来在同一语句中检索作为新列表的结果。这里是我迄今为止最简洁的方法: 网上的例子并没有回答我的问题,因为它们在没有生成新的结果列表的情况下就停止了。一定有更简洁的方式。我希望类具有、、…等方法 变量是否可以通过第三行直接赋值?

  • 问题内容: 我有2个表:product和cart,我希望结合这2个表并根据特定条件以数组形式显示数据,如下所示: 应显示特定类别下的所有产品,如果特定用户购买了给定产品中的任何产品,则其详细信息也应显示在该产品的前面 我到目前为止所做的代码是 它给出了这样的数组 但是我想要代替上面的数组的最后一个数组是 产品表视图(如您所见,产品表中包含一个productid,在每个productid下最多可以有

  • 我明白我需要用硒,但我不知道怎么用。结果始终是单个字符串的列表。理想情况下,我希望返回两个列表:一个带有unix datestamp(option value=“1576627200”),另一个带有“normal”日期(即18/12/2019)的列表。 任何帮助都将不胜感激。