Перейти к содержимому

Фотография
- - - - -

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


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 6

#1 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 12 Июнь 2013 в 20:46

Таблица 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 любимой покупки)
  • 0

Спонсор

#2 Коля1

Коля1

    Прохожий

  • Участник
  • -1
    13 сообщ.

Отправлено 16 Июнь 2013 в 16:08

$sql нужно после равно отправлять запрос: mysql_query( запрос )

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

#3 Коля1

Коля1

    Прохожий

  • Участник
  • -1
    13 сообщ.

Отправлено 17 Июнь 2013 в 11:06

Извиняюсь задание не прочёл, увидел сразу ошибку в коде просто. Если тебе нужно.

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

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

#4 brevis

brevis

    Увлеченный

  • Участник
  • 383
    452 сообщ.

Отправлено 17 Июнь 2013 в 11:24

С вложенным запросом можно:
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
  • 2

#5 Volly

Volly

    Увлеченный

  • Участник
  • 110
    540 сообщ.

Отправлено 17 Июнь 2013 в 12:34

Что значит ORDER BY NULL
  • 0

#6 CamaroSS

CamaroSS

    Частый гость

  • Участник
  • 52
    176 сообщ.

Отправлено 17 Июнь 2013 в 14:16

Вообще есть такой оптимизационный костыль для GROUP BY, но в запросе от brevis групбая уже нет, так что можно убирать.
  • 0

#7 FiRеFоX

FiRеFоX

    Завсегдатай

    Топикстартер
  • V.I.P.
  • 43
    739 сообщ.

Отправлено 17 Июнь 2013 в 16:44

С вложенным запросом можно:

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

Спасибо, работает!
  • 0



Похожие темы Свернуть

Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей