0

私は最終的にこの(下の最初の)クエリを機能させることができました。これにより、action_idの最大値を持つaction_list_tableの行が得られます(したがって、入力したユーザーごとにこのテーブルの最後の「アクション」が得られます)

ここで、これを MAIN_TABLE と JOIN する必要があるので、そこからも情報を引き出すことができます (名前など)

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つのテーブルをJOINする方法についてはかなりずれていると確信しています(または、この場合、1つのテーブルをそれ自体にJOINしてから、別のテーブルにJOINします...)

"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 で結合する 1 つのオプションは、それをサブクエリに入れてから結合することです。

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`

または、サブクエリが必要な理由がわかりません。3 つのテーブルすべてを結合できるはずです。

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。さらに賢くしたい場合は、サブクエリを使用して、最初に MAIN_TABLE に結合された関心のある action_list_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 に答える