Присоединитесь к двум запросам mysql с условием where и последней отметкой времени

Первый запрос предназначен для избранных учреждений, а второй - для получения последнего отзыва об этом учреждении.

Первый запрос:

SELECT 
    instituteId, 
    instituteName, 
    description 
FROM institutions 
WHERE instituteId IN ('1','2','3')";

Второй запрос:

SELECT 
    name,
    review, 
    timestamp 
FROM reviews 
WHERE instituteId='1' 
ORDER BY timestamp DESC 
LIMIT 1; 

я не вижу связанных столбцов в предложениях select или параметре WHERES о том, как объединить оба запроса.

Raymond Nijland 11.04.2018 12:18

через InstituteId

kumar 11.04.2018 12:21

Используйте CTR + K для форматирования текста запроса.

Kedar Limaye 11.04.2018 12:22

хорошо @RaymondNijland

PHP dev 11.04.2018 12:27

такого рода вопросы уже возникали в SO, поэтому я дал свой ответ в комментарии

PHP dev 11.04.2018 12:28

хорошо @RaymondNijland

PHP dev 11.04.2018 12:36

@kumar - какие столбцы связаны в обеих таблицах? Есть ли "InstituteId" в обеих таблицах? Добавьте схему базы данных для обеих таблиц (перечислите все поля в обеих таблицах), чтобы мы могли вам помочь.

Grant 11.04.2018 12:40
0
8
84
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

select i.instituteId, i.instituteName, i.description,
r.name,r.review, r.timestamp
from institutions i inner join reviews  r on i.instituteId=r.instituteId
WHERE instituteId IN ('1','2','3') 
ORDER BY timestamp DESC LIMIT 1
Ответ принят как подходящий
SELECT i.instituteId, 
       i.instituteName, 
       i.description ,
       r.name,
       r.review, 
       r.timestamp
FROM institutions i
INNER JOIN review r
ON i.instituteid = r.instituteId
INNER JOIN (SELECT instituteId,
                   MAX(timestamp) as timestamp
            FROM reviews
            GROUP BY instituteId 
            ) r1
ON r.instituteid = r1.instituteId 
AND r.timestamp = r1.timestamp
WHERE instituteId IN ('1','2','3')

ВЫБЕРИТЕ i.instituteId, i.instituteName, i.description, r.name, r.review, r.timestamp ОТ учреждений i INNER JOIN review r ON i.instituteId = r.instituteId INNER JOIN (SELECT InstituteId, MAX (timestamp) as отметка времени ИЗ обзоров ГРУППА ПО InstituteId) r1 ON r.instituteId = r1.instituteId И r.timestamp = r1.timestamp ГДЕ InstituteId IN ('1', '2', '3')

kumar 11.04.2018 12:48

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

Md. Mahmud Hasan 11.04.2018 12:49

Есть много способов сделать это. Но следующий дает мне лучшую производительность в большом наборе данных. И да не забудьте про индексацию столбцов.

SELECT i.instituteId, 
   i.instituteName, 
   i.description ,
   r.name,
   r.review, 
   r.timestamp
FROM institutions i
LEFT JOIN reviews r
ON i.instituteid = r.instituteId and r.timestamp=
(SELECT MAX(timestamp)
        FROM reviews where reviews.instituteId = r.instituteId 
        ) 
WHERE instituteId IN ('1','2','3')

«Но следующий дает мне лучшую производительность в большом наборе данных» Правда ?? Связанный подзапрос наиболее медленнее всего выполняется по сравнению с JOIN.

Raymond Nijland 11.04.2018 12:41

В моем случае это было лучше, чем присоединение

Md. Mahmud Hasan 11.04.2018 12:43

если нет обзора для идентификатора 3, то каков результат

Jay Shankar Gupta 11.04.2018 12:54

Я использовал левое соединение, так как мне нужны данные института, даже если нет обзора.

Md. Mahmud Hasan 11.04.2018 13:39

Вы можете объединить две таблицы в точке, где обе таблицы соответствуют одному и тому же значению и свойству.

Синтаксис: ВЫБЕРИТЕ имя_столбца ИЗ table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Решение: ВЫБЕРИТЕ i.instituteId, i.instituteName, i.description, v.name, v.review, v.timestamp ОТ учреждений i INNER JOIN отзывы v на i.instituteId = v.instituteId ГДЕ i.instituteId IN ('1', '2', '3') AND v.instituteId = 1 ORDER BY v.timestamp DESC LIMIT 1;

Другие вопросы по теме