2015-03-11 3 views
0

У меня есть 3 таблицы и вы хотите объединить все в одном запросе, чтобы показать последние 10 записей по дате.Mysql Присоединиться к 3 таблицам в одном запросе со отсортированным результатом

t1: id, username 
t2: id, id_t1, med_id, ga_id, au_id, re_id, text, datetime 
t3: id, id_t1, pro_id, au_id, re_id, text, datetime 

Сначала я увидел, что это будет легко с простым левым соединением и где id, но я получил двойные результаты. Затем я попробовал внутреннее и внешнее соединение, а также группу, но результат был плохим.

Так что мой вопрос: как я могу присоединиться ко всем без двойных результатов последних 10 из t2 и t3?

+0

Можете ли вы предоставить то, что вы пробовали, с данными образца и желаемыми результатами? Возможно, вы просто ищете 'limit', но я подозреваю, что это может быть что-то другое. Трудно сказать без данных образца. – sgeddes

ответ

0

Трудно сказать, что именно вы пытаетесь достичь, но вот ключ к его дополнению.

SELECT TOP 10 DISTINCT T1.* 
FROM T1 
INNER JOIN T2 ON T1.id = T2.id_t1 
INNER JOIN T3 ON T1.id = T3.id_t1 
ORDER BY (CASE WHEN T2.[DateTime] > T3.[DateTime] THEN 
      T2.[DateTime] 
      ELSE 
      T3.[DateTime] 
      END) DESC 

Если вам нужно выбрать поле из T2 и T3, GROUP BY по всему полю T1 с заполнителем на поле от t2 и t3 варианта. В противном случае, связанный подзапрос - это путь.

+0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это написано в TSQL – AXMIM

0

Как уже сообщал sgeddes, трудно понять, что вам нужно, не видя некоторых данных из ваших таблиц. Это действительно помогло бы узнать, какова связь между тремя таблицами.

Один вопрос, который у меня есть, в частности: как связаны t2 и t3, если вообще? Похоже, что их может не быть, поскольку каждый из них имеет свой собственный столбец datetime.

Возможно следующее мог бы сделать эту работу, но нам нужно больше информации, чтобы знать наверняка:

(SELECT DISTINCT t1.*, t2.id, t2.au_id, t2.re_id, t2.text, t2.`datetime`, t2.med_id, t2.ga_id, NULL AS pro_id 
FROM t1 
    INNER JOIN t2 ON t1.id = t2.id_t1) 
UNION 
(SELECT DISTINCT t1.*, t3.id, t3.au_id, t3.re_id, t3.text, t3.`datetime`, NULL AS med_id, NULL AS ga_id, t3.pro_id 
FROM t1 
    INNER JOIN t3 ON t1.id = t3.id_t1) 
ORDER BY datetime DESC 
LIMIT 10 
+0

Все 3 таблицы, связанные с t1.id <-> t2.id_t1 <-> t3.id_t1. Его UserID, который является одним и тем же во всех трех таблицах, только в T1 - это информация об этом пользователе, такая как Name, Username, EMail ... Остальная часть T2 и T3 - это другая информация, которая не связана друг с другом. И да, я не хочу писать ограничение 10, но я буду использовать его. Основная проблема - это отношение без двойных результатов. thx – Sunghost

+0

Моим обходным может быть использование двух запросов с лимитом 10 и слияние в php и выбор последних последних 10 из них, но я думаю, что mysql быстрее и требует меньше ресурсов, не так ли? – Sunghost

+0

Я немного изменил запрос. Это ближе к тому, что вам нужно? – Deniz

0

Следующая выбирает имя пользователя и DateTime за последние десять сообщений.

SELECT username, last_ten.`datetime` AS lastpost 
FROM t1 
INNER JOIN (
    SELECT 't2' AS tab, id, `datetime`, t2.id_t1 
    FROM t2 
    UNION ALL 
    SELECT 't3' AS tab, id, `datetime`, t3.id_t1 
    FROM t3 
    ORDER BY datetime DESC 
    LIMIT 10 
) AS last_ten ON t1.id = last_ten.id_t1 
Смежные вопросы