2014-01-28 4 views
0

Это мой SQL-запрос:Объединение выберите отчетливый и заказ

SELECT DISTINCT dest 
    FROM messages 
    WHERE exp = ? 
UNION 
SELECT DISTINCT exp 
    FROM messages 
    WHERE dest = ? 

С помощью этого запроса, я получаю все сообщения, которые я уже отправленные или полученные. Но в моей таблице messages у меня есть поле timestamp, и мне нужно, с этим запросом, добавить заказ по timestamp ... но как?

+0

Если есть несколько записей, которые метка времени вам требуется? – talegna

+0

Мне просто нужно заказывать мои сообщения с новейшими объявлениями –

+0

Ваш запрос не возвращает все отправленные вами сообщения. Он возвращает всех людей, с которыми вы общались, без дубликатов. –

ответ

1
SELECT * 
FROM 
    ( SELECT 
      col1 = dest, 
      col2 = MAX(timestampCol) 
     FROM 
      messages 
     WHERE 
      exp = ? 
     GROUP BY 
      dest 
     UNION 
     SELECT 
      col1 = exp, 
      col2 = MAX(timestampCol) 
     FROM 
      messages 
     WHERE 
      dest= ? 
     GROUP BY 
      exp 
    ) tbl 
ORDER BY col2 

Это должно вернуть только одну строку за distinctexp/dest, хотя я уверен, что это, вероятно, можно было бы сделать без союза; GROUP BY получит только самую последнюю версию.

Обновлено SQL: Учитывая, что это возможно для exp на одной записи, чтобы равняться dest на той же или другой записи.

SELECT 
    CASE WHEN exp = ? THEN dest ELSE exp END AS col1 
    ,MAX(timestampCol) AS col2 
FROM 
    messages 
WHERE 
    exp = ? 
    OR dest = ? 
GROUP BY 
    (CASE WHEN exp = ? THEN dest ELSE exp END) 
ORDER BY 
    MAX(timestampCol) DESC; 

Вы можете рассмотреть вопрос о добавлении SQL Fiddle с некоторыми фиктивными данными, чтобы позволить пользователям лучше помочь вам.

+0

Не знаю, что мне нужно делать с [col1] и [col2]. –

+0

'[col1]' и '[col2]' - это просто имена, которые я дал столбцам с использованием 'UNION', и он разъясняет, какие столбцы будут возвращены. '[col1]' - это отдельная запись, которую вы возвращали в свой запрос, '[col2]' является столбцом метки времени. Если вы не хотите возвращать столбец timestamp, вы можете просто «SELECT DISTINCT [col1]» вместо 'SELECT *' – talegna

+0

Итак, у вас возникла ошибка в синтаксисе SQL ^^ Phpmyadmin не нравится ваш [col1 ] –

0
SELECT * 
FROM 
(
SELECT DISTINCT dest AS Column1, timestamp AS Column2 
    FROM messages 
    WHERE exp = ? 
UNION 
SELECT DISTINCT exp AS Column1, timestamp AS Column2 
    FROM messages 
    WHERE dest = ? 
) tbl 
ORDER BY Column2 
+0

Нет, с этим запросом я получаю все возможные комбинации timestamp ... –

2

Вы можете сделать это без union:

SELECT (case when exp = ? then dest else exp end), timestamp 
FROM messages 
WHERE exp = ? or dest = ?; 

Затем, чтобы получить последнее сообщение для каждого участника, используйте group by не distinct:

SELECT (case when exp = ? then dest else exp end) as other, max(timestamp) 
FROM messages 
WHERE exp = ? or dest = ? 
group by (case when exp = ? then dest else exp end) 
order by max(timestamp) desc; 
+0

У вас есть ошибка в синтаксисе SQL, как для –

+0

@ ClémentAndraud. , , Вот простой скрипт SQL, который показывает, что оба являются синтаксически корректными SQL (http://www.sqlfiddle.com/#!2/c72625/2). Это упрощенная структура таблицы с заменой '0''? '. –

0

Этот запрос поможет вам в получении заказа записи по дате

SELECT tbl.mailId, Max(timestampColumn) MostRecentDate 
FROM 
    (
    SELECT exp AS mailId, Max(timestampCol) AS timestampColumn 
    FROM Employeeatd 
    WHERE dest = ? 
    GROUP BY exp 
UNION 

    SELECT Dept AS abc, Max(timestampCol) AS timestampColumn 
    FROM Employeeatd 
    WHERE exp = ? 
    GROUP BY Dept 
    ) tbl 
GROUP BY mailId 
ORDER BY Max(timestampColumn) desc 
Смежные вопросы