То, что я пытаюсь сделать с помощью кода ниже, получая все ключевые слова с их позициями через LEFT JOIN, он отлично работает, но показывает первую позицию каждого ключевого слова, но я хочу показать последнюю позицию, записанную (по дате).
PHP:
public function getKeyword(){
global $connection;
$array = Array();
$sql = "SELECT keyword.id, keyword.title, keyword.date, rank.position FROM keyword
LEFT JOIN rank
ON rank.wordid = keyword.id
GROUP BY keyword.id
ORDER BY keyword.date DESC";
$result = $connection->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$array[] = $row;
}
}
return $array;
$connection->close();
}
Как я могу это сделать? Должен ли я использовать дополнительный запрос или что? есть ли способ сделать это без подзапроса?
Что я хочу:
Получите 17 вместо 13, я имею в виду последний рекорд позиции.
Не используйте для этого group by
! Вы хотите фильтровать, поэтому используйте предложение where
. В этом случае использование коррелированного подзапроса хорошо работает:
SELECT k.id, k.title, k.date, r.position
FROM keyword k LEFT JOIN
rank r
ON r.wordid = k.id AND
r.date = (SELECT MAX(r2.date)
FROM rank r2
WHERE r2.wordid = k.id
)
ORDER BY k.date DESC
Trying to get property of non-object
с вашим кодом
Вы можете использовать нижеследующий запрос
SELECT keyword.id, keyword.title, keyword.date, rankNew.position FROM keyword LEFT JOIN (
SELECT rank.wordid, rank.position FROM rank ORDER BY rank.id DESC LIMIT 0, 1) AS rankNew ON (rankNew.wordid = keyword.id);
Вы можете получить больше ссылок из Получить последнюю запись в каждой группе - MySQL
SELECT keyword.id, keyword.title, keyword.date, rank.position ... GROUP BY keyword.id
- это недопустимый запрос, который будет приводить к неверным результатам. Приведенные в качестве примера данные с ожидаемым выводом помещают их на sqlfiddle.com или db- fiddle.com .. А также дайте нам версию MySQL сSELECT VERSION()