Помогите составить sql запрос (опять)

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Таблица 1 - это основная таблица, тут юзеры, их пароли и т.д
Таблица 2 - Нууу, предположим, что в этой таблице хранятся даты последних покупок у юзеров.
Таблица 3 - Это уже ВСЕ товары, которые юзеры покупали и в каком количестве (`count`). Например юзер купил чайник - заносится туда, типа чайников он купил 1. Потом он вспомнил, что одного чайника ему не хватит и купил ещё один, тогда увеличиваем параметр count напротив "чайники" на 1. Также и со всеми остальными покупками.
Нужно сделать следующее:
Вывести юзеров из таблицы 1 по каким-либо параметрам, а также вывести инфу из таблицы 2 (например дату последней покупки товара), а также вывести самый "любимый" товар этого юзера(ну тот товар, который он чаще всего покупал - max(), desc - одно и тоже)

Как это выглядит сейчас:
Код:
//Первый запрос, выводим нужных юзеров и вытаскиваем дату последней покупки(действий) из таблицы 2
$sql = "SELECT `table1`.`id`, `table1`.`name`, `table2`.`data` FROM `table1`
LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id_user`
WHERE `table1`.`param` = $param AND `table2`.`param` = $param2
ORDER BY NULL
LIMIT 10";
Затем проверка и цикл ($res - это результат из запроса выше):
Код:
foreach($res as $value) {
    $counts = "SELECT `id`, `count` FROM `table3` WHERE `id_user` = $value['id'] and `id_param` = $param3 ORDER BY `count` DESC LIMIT 1";
}
Ну вот как-то так.. Как избавиться от запроса в цикле?
Попробовал с group by:
Код:
SELECT `table1`.`id`, `table1`.`name`, `table2`.`data`, `table3`.`id` as `id_love`, MAX(`table3`.`count`) FROM `table1`
LEFT JOIN `table2` ON `table1`.`id` = `table2`.`id_user`
LEFT JOIN `table3` ON `table1`.`id` = `table3`.`id_user` AND `table3`.`param` = $param3
WHERE `table1`.`param` = $param AND `table2`.`param` = $param2
GROUP BY `table1`.`id`
ORDER BY NULL
LIMIT 10
Но этот запрос неверно выдает `id_love` (id любимой покупки)
 

Коля1

Member
Регистрация
16.06.2013
Сообщения
13
$sql нужно после равно отправлять запрос: mysql_query( запрос )

иначе это не запрос а просто текст
 

Коля1

Member
Регистрация
16.06.2013
Сообщения
13
Извиняюсь задание не прочёл, увидел сразу ошибку в коде просто. Если тебе нужно.

while ($row = mysql_fetch_array(mysql_query())) можно так сделать с 3 таблицей, только отпишись что есть что в таблице, сделаю.

Совет на будущее: называй таблицы по существу, например users (таблица зареганых юзеров). Когда будешь делать big projects будет неудобно
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
С вложенным запросом можно:
Код:
SELECT `table1`.`id`, `table1`.`name`, `table2`.`buydate`, `table3`.`product`, `table3`.`number`
FROM `table1`
LEFT JOIN `table2` ON `table1`.`id` = `table2`.`user_id`
LEFT JOIN `table3` ON `table1`.`id` = `table3`.`user_id` AND `table3`.`number` = (SELECT MAX(number) FROM table3 WHERE table3.user_id=table1.id)
WHERE `table1`.`name` = 'Vasya'
ORDER BY NULL
LIMIT 10
http://sqlfiddle.com/#!2/cfda3/2
 

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
831
Что значит ORDER BY NULL
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Вообще есть такой оптимизационный костыль для GROUP BY, но в запросе от brevis групбая уже нет, так что можно убирать.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
С вложенным запросом можно:
Код:
SELECT `table1`.`id`, `table1`.`name`, `table2`.`buydate`, `table3`.`product`, `table3`.`number`
FROM `table1`
LEFT JOIN `table2` ON `table1`.`id` = `table2`.`user_id`
LEFT JOIN `table3` ON `table1`.`id` = `table3`.`user_id` AND `table3`.`number` = (SELECT MAX(number) FROM table3 WHERE table3.user_id=table1.id)
WHERE `table1`.`name` = 'Vasya'
ORDER BY NULL
LIMIT 10
http://sqlfiddle.com/#!2/cfda3/2
Спасибо, работает!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ