我终于能够得到这个(下面的第一个)查询工作了,它给了我一行action_list_table,它具有action_id的最大值(所以它给了我每个用户输入的最后一个“动作”)
现在我需要用我的MAIN_TABLE加入这个,所以我也可以从中提取信息(名称等)
SELECT * FROM `action_list_table` a
LEFT OUTER JOIN `action_list_table` b
ON (a.`record_id` = b.`record_id` AND a.`action_id` < b.`action_id`)
WHERE a.`record_id` = '".$ID."' AND b.`record_id` IS NULL"
我厌倦了这一点,但它没有用,我肯定我已经离开了如何加入3张桌子(或者在这种情况下) 将一个表连接到自身,然后加入另一个表......)
"SELECT * FROM `action_list_table` a
LEFT OUTER JOIN `MAIN_TABLE`
ON a.`record_id` = `MAIN_TABLE.ID`
LEFT OUTER JOIN `action_list_table` b
ON (a.`record_id` = b.`record_id` AND a.`action_id` < b.`action_id`)
WHERE b.`record_id` IS NULL");
同样,我正在尝试:在每个用户的动作表中找到行(具有最高action_id的用户(这将是自自动增量以来创建的最后一个用户)然后还拉入一些列来自MAIN_TABLE,其中action_list_table上的ID(record_id)= MAIN_TABLE上的ID
答案 0 :(得分:0)
如果您的查询按照您需要的方式工作,则加入main_table的一个选项是将其放入子查询中,然后进行连接:
SELECT *
FROM (
SELECT a.*
FROM `action_list_table` a
LEFT OUTER JOIN `action_list_table` b
ON (a.`record_id` = b.`record_id` AND a.`action_id` < b.`action_id`)
WHERE a.`record_id` = '".$ID."' AND b.`record_id` IS NULL
) tablealias
LEFT JOIN `MAIN_TABLE`
ON tablealias.`record_id` = `MAIN_TABLE`.`ID`
或者,我不确定你为什么需要子查询 - 你应该能够加入所有三个表:
SELECT *
FROM `action_list_table` a
LEFT OUTER JOIN `action_list_table` b
ON (a.`record_id` = b.`record_id` AND a.`action_id` < b.`action_id`)
LEFT JOIN `MAIN_TABLE`
ON a.`record_id` = `MAIN_TABLE`.`ID`
WHERE a.`record_id` = '".$ID."' AND b.`record_id` IS NULL
最后,正如其他人所建议的那样,您可以使用MAX(Action_ID)加入:
SELECT *
FROM `action_list_table` a
INNER JOIN
(SELECT MAX(Action_ID) max_action_id, Record_ID
FROM action_list_table
GROUP BY Record_ID) t
ON a.action_id = t.max_action_id and a.record_id = t.record_id
LEFT JOIN `MAIN_TABLE`
ON a.`record_id` = `MAIN_TABLE`.`ID`
WHERE a.`record_id` = '".$ID."'
答案 1 :(得分:0)
您可以通过使用简单的GROUP语句更简单地获取必要的信息,即
SELECT
*,
MAX(a.action_id) AS last_action_id
FROM MAIN_TABLE mt
INNER JOIN action_list_table a
ON a.record_id = mt.ID
GROUP BY mt.id
Thiis只会从表a
中为action_id提供正确的值。如果你想变得更聪明,你可以使用子查询只从第一个位置获取action_list_table中的记录,这些记录是MAIN_TABLE中感兴趣的
SELECT
a.*,
MAX(a.action_id) AS last_action_id
FROM MAIN_TABLE mt
INNER JOIN (
SELECT
*
FROM (
SELECT
*
FROM action_list_table
ORDER BY action_id DESC
) o
GROUP BY o.record_id
) a
ON a.record_id = mt.ID