Нужна моя таблица, чтобы создать только одну строку для идентификатора - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно объединить две таблицы:

ТАБЛИЦА 1

t1_id | t1_text | t1_date

ТАБЛИЦА 2

t2_id | t2_text | t2_date | t1_id

Что я хочу получить:

t1_text | t1_date | t2_text | t2_date

таблица должна отображать самые последние, уникальные строки t1 вместе с их связанным t2_text и его t2_date

Это то, что я получил такдалеко:

SELECT `table_1`.`t1_text` AS 'Text', `table_1`.`t1_date` AS 't1_date', `table_2`.`t2_text` AS 't2_Text', `table_2`.`t2_date` AS 'Date' 
FROM `table_1` 
LEFT JOIN `table_2` ON `table_1`.`t1_id`=`table_2`.`t1_id` 
ORDER BY `table_1`.`t1_date` DESC 
LIMIT 10

Близко, но без сигары.Я все еще получаю одни и те же строки t1, чтобы они появлялись более одного раза

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я не уверен, что четко понимаю, какой у вас желаемый результат.Попробуйте следующее:

SELECT news.text AS 'News', news.date AS 'Publish date', 
comments.text AS 'Most Recent Comment', comments.date AS 'Comment Date' 
FROM news
JOIN (
    SELECT text, MAX(newsId) as newsId, date
    FROM comments 
    GROUP BY newsId
)comments ON news.newsId=comments.newsId
WHERE comments.text IS NOT NULL 
ORDER BY news.date DESC LIMIT 10
0 голосов
/ 27 марта 2019

С уточнением относительно уникальности полей идентификаторов:

select  t1.t1_id, t1.t1_date, t1.t1_text, t2.t2_id, t2.t2_date, t2.t2_text
from table_1 t1
inner join (SELECT  t1_id, max(t1_date) as date from table_1) t1m
   on t1.t1_id = t1m.t1_id and t1.t1_date = t1m.date
inner join table_2 t2
   on t1.t1_id = t2.t1_id
inner join (SELECT  t2_id, max(t2_date) as date from table_2) t2m
   on t2.t2_id = t2m.t2_id and t2.t2_date = t2m.date;

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

Тем не менее, могут быть дубликаты t1_id, если комбинация t1_id и t1_date не уникальна.Но в этом случае я не думаю, что дублирование должно быть скрыто, а скорее устранено.


Оригинальный ответ:

Вам нужно использовать внутреннее соединение, а не левое соединение.

    SELECT `table_1`.`t1_text` AS 'Text', `table_1`.`t1_date` AS 't1_date', `table_2`.`t2_text` AS 't2_Text', `table_2`.`t2_date` AS 'Date'
    FROM `table_1`
    INNER JOIN `table_2`
    ON `table_1`.`t1_id`=`table_2`.`t1_id`
    ORDER BY `table_1`.`t1_date` DESC LIMIT 10

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...