SQL - упорядочение левых соединений и основные результаты - PullRequest
0 голосов
/ 24 января 2012

Я сейчас пытаюсь вернуть всех инженеров из базы данных.Наряду с этим, некоторая другая пользовательская информация.Но я хочу, чтобы таблица AC присоединилась к самой последней строке, а затем упорядочила основные результаты по имени контакта.

Может кто-нибудь бросить меня в правильном направлении?

SELECT 
    mb.type, mb.contactname, mb.id, mb.inv_addressline2, mb.inv_addressline3, mb.signup_date,
    fb.engineer_id, fb.job_id, fb.neg_or_pos, fb.rating, fb.author_id,
    ac.engineer_id, ac.timestamp, ac.author_id,
    jb.job_id, SUBSTRING(jb.job_description, 0, 200) AS `short_description`, jb.timestamp 
FROM " . MEMBERS_TABLE . " AS mb 
LEFT JOIN " . ACCEPTED . " AS ac ON mb.id = ac.engineer_id 
LEFT JOIN " . FEEDBACK . " AS fb ON ac.job_id = fb.job_id 
LEFT JOIN " . JOBS . " AS jb ON fb.job_id = jb.job_id 
WHERE mb.type = 2 
GROUP BY mb.contactname 
ORDER BY ac.timestamp DESC

Ответы [ 2 ]

0 голосов
/ 24 января 2012

разобрался в итоге:

SELECT 
    res.type, res.contactname, res.id, res.inv_addressline2, res.inv_addressline3, res.signup_date,
    res.engineer_id_global, res.job_id_global, res.neg_or_pos, res.rating, res.author_id_global,
    res.timestamp_global, res.job_description               
FROM
    (
        SELECT
            mb.type, mb.contactname, mb.id, mb.inv_addressline2, mb.inv_addressline3, mb.signup_date,
            fb.engineer_id AS `engineer_id_global`, fb.timestamp AS `timestamp_global`, fb.job_id AS `job_id_global`, fb.neg_or_pos, fb.rating, fb.author_id AS `author_id_global`,
            ac.engineer_id, ac.timestamp, ac.author_id,
            jb.job_id, jb.job_description 
        FROM
            " . MEMBERS_TABLE . " AS mb 
        LEFT JOIN
            " . ACCEPTED . " AS ac 
        ON
            mb.id = ac.engineer_id 
        LEFT JOIN 
            " . FEEDBACK . " AS fb 
        ON 
            ac.job_id = fb.job_id 
        LEFT JOIN
            " . JOBS . " AS jb 
        ON 
             fb.job_id = jb.job_id 
        WHERE 
            mb.type = 2 
        ORDER BY
            fb.timestamp DESC
    ) AS res 
GROUP BY 
    res.contactname
ORDER BY
    res.contactname

Приветствия

EDIT

Вышеописанное теперь работает!

0 голосов
/ 24 января 2012

Так что выбирайте только строки из переменного тока, где отметка времени является максимальной для этой группы; затем заказать по контактному имени.

Вот запрос, чтобы сопоставить каждого инженера с его максимальной отметкой времени:

SELECT engineer_id, max(timestamp) as latest
FROM ac
GROUP BY engineer_id;

Затем выберите только те строки, чьи (id, timestamp) находятся в этой таблице.

...