Змінюй хід війни! Допомагай ЗСУ!

Комбинированный SQL запрос

🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
Статус: Offline
Реєстрація: 16.08.2014
Повідом.: 299
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #1
Комбинированный SQL запрос

Приветствую. Есть небольшой затык в SQL запросе. Выборка идет из PHP/MySQL. Задача состоит в том, что есть список переписок между заказчиками и клиентами. Нужно собрать все в папку "В работе" (type = 2). Пока вывожу так:
Код:
#` Список всех сделок, в которых есть моё участие
$sql = "SELECT DISTINCT M.`id_deal`, D.`id_owner` FROM `messages` M LEFT JOIN `deals` D ON D.`id`=M.`id_deal` WHERE (M.`id_whom`='${my_id}' OR M.`id_from`='${my_id}') and M.`type`='2'";
$DbRes = DB::run($sql);
if ( empty($DbRes) ) return done(Env::stor($this->iam, 'board', 'Нет сообщений!'));
foreach ( $DbRes as $row => $Line ) {
	$is_owner = ( $Line['id_owner'] == $my_id );
	$id_deal = $Line['id_deal'];
	if ( $is_owner ) {
		#` Моя задача, кому я писал по этой сделке?
		$sql = "SELECT DISTINCT `id_whom` as `sender`, `id_deal` FROM `messages` WHERE `type`='2' AND `id_from`='${my_id}' AND `id_deal`='${id_deal}'";
	} else {
		#` Чужая задача, кто ответил мне по заявке?
		$sql = "SELECT DISTINCT `id_from` as `sender`, `id_deal` FROM `messages` WHERE `type`='2' AND `id_whom`='${my_id}' AND `id_deal`='${id_deal}'";
	}
}
Проблема в том, что я хочу сортировать список по полю date_added->(TIMESTAMP) , но не хочу делать тучу однотипных SQL запросов в цикле.

upd Мне нужна только дата последнего сообщения по каждой переписке, всунуть что-то вроде
Код:
ORDER BY `date_added` DESC LIMIT 1
 
Останнє редагування:
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #2
Не понятно, нужна выборка по критериям или исключительно последнее собщение?

Если выборка, то делается через цикл while, если исключительно последний запрос, то во время селекта - SELECT * FROM xxxx ORDER BY id DESC LIMIT 1

Можно делать цикл while с выборкой по соответствующим критериям, после select.
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #3
Сначала нужно выбрать конкретные диалоги только между двумя людьми из общей переписки, а потом расставить их во временном порядке (по последнему сообщению), пытаясь один select вложить в другой. Пока да, циклом обхожусь, наверное и правда никак.
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #4
Сначала нужно выбрать конкретные диалоги только между двумя людьми из общей переписки, а потом расставить их во временном порядке (по последнему сообщению), пытаясь один select вложить в другой. Пока да, циклом обхожусь, наверное и правда никак.

Ну так в диалоге между двумя людьми есть по крайней мере один постоянный, например, оператор . Если этот оператор имеет некий идентификатор (я так понимаю, sender), то мы по запросу select делаем выборку по этому идентификатору в цикле while и потом уже выводим в порядке от последнего к первому по критерию date или id из запроса базы. Как-то так:

$result = mysql_query("SELECT * FROM xxxx ORDER BY sender");

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf ("ID: %s Name: %s", $row[0], $row[1]);
}
mysql_free_result($result);
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #5
Постоянного нет. Есть user1, который создал задачу id в таблице deals. Другой (скажем user2) решил эту задачу выполнить, он подал заявку (головное сообщение id_first=last_insert_id с id_parent=0 и type=1{request}). Если user1 согласился обсуждать, то он пишет второму (id_parent={id_first} и type=2{discussion}). По этой же сделке может быть переписка с user3,user4 и т.д. Каждую переписку надо сделать отдельной веткой и строчкой со ссылкой на конкретный диалог. Но строчки эти я хотел разложить по дате последнего написанного сообщения (с кем последним общались - тот выше).
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #6
Может тогда просто сделать в таблице БД еще одно поле, где бы отмечались остальные учатсники user3,user4 и т.д. и по этому полю делалась выборка?!
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #7
Если делать циклом как Вы говорите, все как бы работает и оно будет - но есть один затык :) Я вложил скриншот: там даты не в том порядке стоят, в котором я хочу. Потому что DISTINCT не даёт мне сделать ORDER, а при зацикливании уже теряется связь с данными в таком контексте. На хостинге нельзя создавать временные таблицы, вот я и подумал сделать комбинированный вложенный запрос, а так конечно я и столбец могу отсортировать уже потом в массиве.
Я просто расширить свое понимание SQL хотел.
 

Вкладення

  • 43ac370a-f240-405d-b6c2-eb027934002d.jpg
    43ac370a-f240-405d-b6c2-eb027934002d.jpg
    19.4 КБ · Перегляди: 115
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #8
пора бы и GROUP BY освоить...
 
  • 🟢 17:23 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #9
Назад
Зверху Знизу