我在从两个表中检索数据然后列出它们时遇到了一些问题。我想将用户的提要帖子和他们喜欢的事件全部列在一个列表中。
- 供稿 - 用户帖子表
- Likes - 用户喜欢的表(因此,当用户喜欢帖子时,记录会添加到喜欢中(表
likes
包含data
,其中包含feeds ID
喜欢的帖子)
我正在尝试做的事情:在事件墙中列出提要和用户的“喜欢”事件。
所以它应该像这样输出(按时间戳 desc 排序):
- “这是用户 A 的帖子”
- 显示用户 C 喜欢用户 B 的帖子
- “这是用户 B 的帖子”
- “这是用户 L 的帖子”
- 显示用户 A 喜欢用户 F 的帖子
- “这是用户 F 的帖子”
- -继续-
我当前的 SQL:
SELECT * FROM feeds,likes WHERE feeds.deleted!=0 or likes.deleted!=0 ORDER BY feeds.timestamp, likes.timestamp
但是,我的问题是我不知道如何链接这两个表,因为我的“提要”中的 ID 与“喜欢”中的 ID 不同
最佳答案
要合并这两个集合,您可以使用 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
和另一个查询。
组合结果集中的列名由第一个查询确定。第二个查询中的列名和别名将被忽略。
ORDER BY
应用于整个集合,并在最后一个选择之后。
关于php - 从多个表中检索数据并将它们列在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582982/