2015-10-26 2 views
0

У меня есть 2 таблицы ссылок по userPhone.MySQL. Выберите последнюю запись (по времени создания) из второй таблицы

Таблица пользователей

+-----------+-------+----------+--------+ 
| userPhone | name | address | car | 
+-----------+-------+----------+--------+ 
| 096111111 | Bill | adr1 | {json} | 
+-----------+-------+----------+--------+ 
| 097333333 | Max | adr2 | {json} | 
+-----------+-------+----------+--------+ 
| 098888888 | Denis | adr3 | {json} | 
+-----------+-------+----------+--------+ 

Таблица Заказы

+-----------+---------+-------+-------+------------+ 
| userPhone | orderID | title | Descr | createdTS | 
+-----------+---------+-------+-------+------------+ 
| 096111111 | 59  | ttl1 | qqqq | 1444999740 | 
+-----------+---------+-------+-------+------------+ 
| 096111111 | 58  | ttl2 | wwww | 1444999650 | 
+-----------+---------+-------+-------+------------+ 
| 096111111 | 56  | ttl3 | rrrrr | 1444999600 | 
+-----------+---------+-------+-------+------------+ 
| 096111111 | 57  | ttl4 | ttttt | 1444999540 | 
+-----------+---------+-------+-------+------------+ 

Я использую запрос, как это, и он работает хорошо:

SELECT 
     `users`.`userPhone`, 
     `users`.`name`, 
     `users`.`address`, 
     `users`.`car`, 
     (SELECT `title` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW() ORDER BY `orders`.`createdTS` DESC LIMIT 1) as `title`, 
     (SELECT `descr` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW() ORDER BY `orders`.`createdTS` DESC LIMIT 1) as `descr` 
FROM 
       `users` 
       LEFT JOIN `orders` USING (`userPhone`) 
WHERE 
       `users`.`userPhone` like '%1111%'; 

НО я думаю, дополнительный SELECT работают медленно. Есть ли лучший и быстрый способ решить эту проблему?

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

+0

Попробуйте только ** РЕГИСТРИРУЙТЕСЬ ** заказы вместо ** LEFT JOIN **. NB, если у вас нет записи во второй таблице, ваш выбор будет пустым – Lucarnosky

ответ

2

Правильно syntaxed РЕГИСТРИРУЙТЕСЬ воли сделайте все это для вас, не требуя внутреннего SELECT и намного быстрее.

SELECT 
     `users`.`userPhone`, 
     `users`.`name`, 
     `users`.`address`, 
     `users`.`car`, 
     `orders`.`title`, 
     `orders`.`desc` 
FROM `users` 
    JOIN `orders` ON `orders`.`phone` = `users`.`phone` 
WHERE 
     `users`.`userPhone` like '%1111%' 
    AND `orders`.`orderTS` < NOW() 
ORDER BY `orders`.`orderTS` DESC 
LIMIT 1; 

Если вы хотите, чтобы все эти записи, то просто удалите LIMIT 1

+0

Он вернет только одну запись, но мне нужны все записи, где userPhone нравится% 111% –

+0

Затем удалите 'LIMIT 1' – RiggsFolly

0

Вам не нужно зарегистрироваться или LEFT JOIN любой таблицы, если вы используете внутренний ВЫБЕРИТЕ

Попробуйте

SELECT 
     `users`.`userPhone`, 
     `users`.`name`, 
     `users`.`address`, 
     `users`.`car`, 
     (SELECT `title` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW() ORDER BY `orders`.`createdTS` DESC LIMIT 1) as `title`, 
     (SELECT `descr` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW() ORDER BY `orders`.`createdTS` DESC LIMIT 1) as `descr` 
FROM 
       `users` 
WHERE 
       `users`.`userPhone` like '%1111%'; 

Это должно быть быстрее

Смежные вопросы