Как выбрать 1 строку при соединении таблицы

Моя цель состоит в том, чтобы получить пользователей и один новый пользователь записи, я попытался понять это на google, но я потерпел неудачу, так что вы мой последний шанс. О вещах, которые я пробовал:

DB::select('SELECT u.id, u.username, u.user_rating, 
 u.avatar, u.created_at, e.id as e_id, e.title 
 FROM users u
 LEFT JOIN 
 (
 SELECT e.*
 FROM entry e
 LIMIT 1
 ) entry AS e ON e.user_id = u.id
 ORDER BY u.user_rating DESC 
 LIMIT 10

Я использую MySQL

РЕДАКТИРОВАТЬ:

с этим это не дает мне ошибку, но она не принимает никакой записи из соединения:

DB::select('SELECT u.id, u.username, u.user_rating, 
 u.avatar, u.created_at, e.id as e_id, e.title 
 FROM users u
 LEFT JOIN 
 (
 SELECT e.*
 FROM entry e
 ORDER BY e.id DESC
 LIMIT 1
 ) AS e ON e.user_id = u.id
 ORDER BY u.user_rating DESC 
 LIMIT 10');

Результат:

object(stdClass)#437 (7) {
["id"]=>
int(5002)
["username"]=>
string(6) "Nelosh"
["user_rating"]=>
int(77763)
["avatar"]=>
string(3) "its"
["created_at"]=>
string(19) "2013-12-16 19:20:23"
["e_id"]=>
NULL
["title"]=>
NULL

}

3 ответа

Попробуй это:

SELECT u.id, u.username, u.user_rating, u.avatar, u.created_at, e.id AS e_id, e.title 
FROM users u
LEFT JOIN (SELECT * FROM (SELECT * FROM entry e ORDER BY e.user_id, e.id DESC) AS e GROUP BY e.user_id) AS e ON e.user_id = u.id
ORDER BY u.user_rating DESC 
LIMIT 10;

ИЛИ

SELECT u.id, u.username, u.user_rating, u.avatar, u.created_at, e.id AS e_id, e.title 
FROM users u
LEFT JOIN (SELECT * FROM entry e ORDER BY e.user_id, e.id DESC) AS e ON e.user_id = u.id
GROUP BY u.id
ORDER BY u.user_rating DESC 
LIMIT 10;

РЕДАКТИРОВАТЬ:

SELECT u.id, u.username, u.user_rating, u.avatar, u.created_at, e.id AS e_id, e.title 
FROM (SELECT u.id, u.username, u.user_rating, u.avatar, u.created_at FROM users u ORDER BY u.user_rating DESC LIMIT 10) AS u 
LEFT JOIN (SELECT e.id, e.user_id, e.title FROM entry e ORDER BY e.user_id, e.id DESC) AS e ON e.user_id = u.id
GROUP BY u.id;


В вашем подзапросе вам нужно добавить ORDER BY, чтобы получить последнюю запись. Если ваш e.id автоинкремент, вы можете сделать это:

...
SELECT e.*
FROM entry e
ORDER BY e.id DESC LIMIT 1
...


Использовать это:

DB::select('SELECT u.id, u.username, u.user_rating, 
 u.avatar, u.created_at, e.id as e_id, e.title 
 FROM users u
 LEFT JOIN 
 (
 SELECT e.*
 FROM entry e
 ORDER BY e.created_date DESC //add this condition also
 LIMIT 1
 ) entry AS e ON e.user_id = u.id
 ORDER BY u.user_rating DESC 
 LIMIT 10

licensed under cc by-sa 3.0 with attribution.