0

我终于能够让这个(下面的第一个)查询工作,它给了我 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

4

2 回答 2

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."'
于 2013-03-27T18:40:36.753 回答
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

不过,这只会为您提供表格中 action_id 的正确值a。如果你想变得更聪明,你可以使用子查询首先只从 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
于 2013-03-27T18:43:10.180 回答