我有每个用户的事件页面和状态消息页面。
在事件中它包含了用户做过的事情,比如与某人成为 friend 、对图片发表评论等。
users_activities
id | uID | msg | date
在 users_statusmessages 中,我得到了用户创建的状态消息。
users_statuses
id | uID | message | date
uID 是用户的 ID。
现在我想同时选择它们并将它们合二为一。{}它们按日期 desc 排序的位置(因为两个表中的日期都是 UNIX 时间戳)。
所以类似于 WHERE uID = '$userID' ORDER BY date DESC
我希望它看起来如何的例子:
User: Today is a good day (message) (date: 1284915827) (users_statuses)
User have added as Jack as friend (msg) (date: 1284915811) (users_activities)
User: I have a hard day today (message) (date: 1284915801) (users_statuses)
User have commented on Jacks picture (msg) (date: 1284915776) (users_activities)
我应该如何正确执行此操作?
最佳答案
您需要使用 UNION 运算符:
SELECT ua.msg,
ua.date,
'activity' AS is_table
FROM USERS_ACTIVITIES ua
WHERE ua.uid = '{$userID}'
UNION ALL
SELECT us.message,
us.date,
'status'
FROM USERS_STATUSES us
WHERE us.uid = '{$userID}'
ORDER BY `date`
联盟
UNION
删除重复项。 UNION ALL
不会删除重复项,而且速度更快。
但是 SELECT 中每个位置的数据类型必须匹配。在提供的查询中,您可以看到在第二个位置引用了日期列。如果第一个查询和第二个查询之间的列顺序颠倒,则会出现错误。
ORDER BY 应用于标准 SQL 中 UNION 查询的结果。在 MySQL 中,这包括 LIMIT
子句。但 MySQL 还支持在 UNION 查询周围放置括号,因此您可以在 UNION 查询之前使用 ORDER BY & LIMIT。
关于PHP:选择 2 个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3746632/