slavamakhotkin
Новичок
Сортировка и фильтр по вложенному запросу
Здравствуйте.
Есть две таблицы. В первой хранятся страницы сайта (поля id, url, deleted). Во второй странице хранится история посещения страниц (id, page_id, when, ip).
Нужно одним запросом получить список страниц сайта, отсортированный по времени последнего посещения, но исключить из списка страницы, посещенные с определенного айпи (скажем, 127.0.0.1). Как это можно сделать?
Я составил такой запрос:
[SQL]SELECT T.id, T.url, H.when
FROM `pages` T
LEFT JOIN (
SELECT `when`, page_id
FROM `history`
ORDER BY `when` DESC
) H ON H.page_id = T.id
WHERE T.deleted = 0
GROUP BY T.id
ORDER BY H.when DESC
[/SQL]
который вроде сортирует по времени последнего посещения. Но как добавить сюда фильтр по айпи адресу?
Можно, в принципе, сделать второй запрос. То есть, сначала получить список отсортированных страниц, а отфильтровать те, которые еще не посещались этим айпишником, примерно вот так:
[SQL]SELECT page_id
FROM `history`
WHERE page_id IN (айдишники) AND ip = '127.0.0.1' AND when IS NULL
[/SQL]
либо сложить эти оба запроса вместе и нагородить такую городулю:
[SQL]SELECT T.id
FROM (
SELECT T.id, T.url, H.when
FROM `pages` T
LEFT JOIN (
SELECT `when`, page_id
FROM `history`
ORDER BY `when` DESC
) H ON H.page_id = T.id
WHERE T.deleted = 0
GROUP BY T.id
) T
LEFT JOIN `history` H ON H.page_id = T.id AND H.ip = '127.0.0.1'
WHERE H.when IS NULL
ORDER BY T.when ASC
[/SQL]
Городуля эта работает, насколько я могу судить, правильно. Имеет ли она право на существование, или можно эту задачу решить эффективнее и элегантнее?
Здравствуйте.
Есть две таблицы. В первой хранятся страницы сайта (поля id, url, deleted). Во второй странице хранится история посещения страниц (id, page_id, when, ip).
Нужно одним запросом получить список страниц сайта, отсортированный по времени последнего посещения, но исключить из списка страницы, посещенные с определенного айпи (скажем, 127.0.0.1). Как это можно сделать?
Я составил такой запрос:
[SQL]SELECT T.id, T.url, H.when
FROM `pages` T
LEFT JOIN (
SELECT `when`, page_id
FROM `history`
ORDER BY `when` DESC
) H ON H.page_id = T.id
WHERE T.deleted = 0
GROUP BY T.id
ORDER BY H.when DESC
[/SQL]
который вроде сортирует по времени последнего посещения. Но как добавить сюда фильтр по айпи адресу?
Можно, в принципе, сделать второй запрос. То есть, сначала получить список отсортированных страниц, а отфильтровать те, которые еще не посещались этим айпишником, примерно вот так:
[SQL]SELECT page_id
FROM `history`
WHERE page_id IN (айдишники) AND ip = '127.0.0.1' AND when IS NULL
[/SQL]
либо сложить эти оба запроса вместе и нагородить такую городулю:
[SQL]SELECT T.id
FROM (
SELECT T.id, T.url, H.when
FROM `pages` T
LEFT JOIN (
SELECT `when`, page_id
FROM `history`
ORDER BY `when` DESC
) H ON H.page_id = T.id
WHERE T.deleted = 0
GROUP BY T.id
) T
LEFT JOIN `history` H ON H.page_id = T.id AND H.ip = '127.0.0.1'
WHERE H.when IS NULL
ORDER BY T.when ASC
[/SQL]
Городуля эта работает, насколько я могу судить, правильно. Имеет ли она право на существование, или можно эту задачу решить эффективнее и элегантнее?