MYSQL加入三个表(一个本身)

时间:2013-03-27 18:34:11

标签: mysql

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

2 个答案:

答案 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