如何使用JOIN语句

时间:2015-04-22 16:23:04

标签: php mysql sql sql-server mysqli

主要表:'帖子'。
结构:

id || text || time || user_id


辅助表:'喜欢' 结构:

id || post_id || time || user_id


这里,第二个表中的post_id可以(并且必须)是第一个表中的ID。我正在运行一个查询,我从特定user_id的posts表中获取所有ID,并从特定user_id的likes表中获取所有POST_ID。这是查询:

SELECT p.id FROM posts p 
LEFT JOIN likes l ON p.id=l.post_id 
WHERE p.user_id=$userid OR   
l.user_id=$userid

两个表上的时间字段都是数字,类型为int(12)。 Unix时间戳存储在此处,如 1234567890 。我想订购我在两张桌子上按时间字段提取的数据。

例如,帖子表中有2个帖子,ID为1的帖子的时间值为1234567891,ID为2的帖子的时间值为1234567896。并且有1个帖子,其中ID为3时间价值为1234567893。

我想按时间排序,如下:

帖子ID 1,帖子ID 3,帖子ID 2。

由于邮政编号3在邮政编号2之前发生。我如何处理它,因为时间和它的值可以在任何一个表格中。

谢谢!

3 个答案:

答案 0 :(得分:1)

在加入后,您有两个时间列,每个列一个。您需要为SQL提供一些逻辑以供两者使用 - 例如,按MAX(l.time,p.time)排序,以获得更大的值。

基本上,当你说“我想订购我在两个表上的时间字段中提取的数据”时,你需要更清楚地定义,然后应该直截了当地做你想要的。试着考虑如何手工完成,或者如何指导某人手工完成 - 如果你只是将这些记录交给纸上并说“按照两组数据中的时间字段按顺序排列“,他们不知道该怎么做 - 而MySQL也不知道!

答案 1 :(得分:0)

尝试在ORDER BY子句中使用CASE表达式。按时间顺序按时间< l.time THEN p.time ELSE l.time END CASE

答案 2 :(得分:0)

我认为最简单的方法是使用union语句将这些时间值放入一列。尝试这样的事情:

SELECT id from 
(SELECT p.id, p.time FROM posts p
WHERE p.user_id=$userid
union all 
SELECT l.id, l.time FROM posts p 
INNER JOIN likes l ON p.id=l.post_id 
WHERE p.user_id=$userid OR   
l.user_id=$userid) allposts
ORDER BY time