[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: "Интересная выборка"...
allplayer
Доброго времени суток, уважаемые форумчане! У меня по мере разработки появился вопрос.
В общем, у меня есть 2 таблицы.

tb1:
Id | user | userId |
-----------------------
1 | Петя | 7 |
2 | Вася | 2 |
3 | Нина l 4 |
4 | Паша | 2 |
5 | Игорь | 1 |
6 | Анна | 2 |


tb2:
UserId | message | Time
-----------------------------
9 | ertyujh | 12:00
9 | ty67jhg | 13:15
4 | 908htgf | 16:03
7 | 09uyth | 16:05
3 | 7uhgggg| 18:00
4 | ghjuu8p | 22:50

Помогите правильно составить запрос. Мне нужно из БД получить только по одной последней записи каждого пользователя, прикрепленного к аккаунту #2

SELECT * FROM "tb2" WHERE "UserId" IN
(SELECT "Id" FROM "tb1" WHERE "userId"=2 ORDER BY "ImeiId" DESC)
ORDER BY "Time" DESC;


Но такой запрос мне выдает все сообщения пользователей, прикрепленных к аккаунту 2 :(
Помогите, пожалуйста.
Заранее благодарен :rolleyes:
xlebosol
SELECT * FROM tb2 WHERE `UserId` =
(
SELECT `Id` FROM tb1 WHERE `userId`=2 ORDER BY `ImeiId` DESC)
ORDER BY `Time` DESC LIMIT 1;
allplayer
Цитата (xlebosol @ 1.05.2013 - 08:11)
SELECT * FROM tb2 WHERE `UserId` =
(
SELECT `Id` FROM tb1 WHERE `userId`=2 ORDER BY `ImeiId` DESC)
ORDER BY `Time` DESC LIMIT 1;

Если поставить лимит 1, то я получу всего одну самую последнюю запись, сделанную каким-либо пользователем второго аккаунта. А мне нужно, чтобы по одной за каждого пользователя, то есть от Паши, Васи и Анны sad.gif
Valick
allplayer, так не получится, либо ставите метку в строке последней записи для каждого пользователя, либо создаете отдельную таблицу, для последних записей, естественно при записи в такую таблицу проверяете существует ли запись для данного пользователя, и если да то переносите её в общую таблицу, а потом вставляете последнюю запись.


_____________
Стимулятор ~yoomoney - 41001303250491
allplayer
Это очень большой геморой. В таблицу добавляется по 100 записей в секунду, пользователей больше тысячи. Да и таблица миллиардная. Лишняя нагрузка на сервер. Я видел, что в запрос прописывали цикл типа for. Но вот как это делали - я не помню...
Может, кто-нибудь знает о цикличности внутри запроса?
DedMorozzz
Переделай под себя. Делал похожу задачу. Необходимо выбрать 5 городов для каждой страны
отсортированых по ранку

$this->query("SET @a:=1");
  $this->query("SET @iso:=''");
     
  $sql = "SELECT
      q.*
      FROM (
      SELECT * FROM remake_town_city AS p
      WHERE rank>0
      ORDER BY country_iso ASC, rank DESC
      ) AS q
      WHERE
        (IF(@iso=q.country_iso, @a:=@a+1, ((@a:=1) AND (@iso:=q.country_iso))) <= 5)
      "
;
  $result = $this->query($sql);
 
  if ($result){
  $result_temp = array();
  foreach($result as $item){
    $result_temp[] = $item['q'];
  }
  $result = $result_temp;
  }
  return $result;


Но я не стану утверждать, что это самое оптимальное решение. Может попозже подробнее вникну

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
DedMorozzz
тю, так тут вообще тривиальная задача
Выбираешь и групируешь. Выглядит так:

SELECT * FROM
(SELECT * FROM "tb1" WHERE "userId"=2 ORDER BY `Time` DESC)
GROUP BY userId


Что тут делается: выбираются всё из таблицы tb1, сортируется по времени, далее групируется по юзеру. Итого будет у всех по 1 записи, для каждого юзера

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
sergeiss
allplayer, что-то не понятно насчет структуры таблиц. UserID - это на самом деле у тебя не индентификатор какого-то юзера, как можно подумать, глядя на название этого столбца. Потому что он не уникальный, этот параметр. Давай начнем со структуры таблиц: что есть что у тебя и для каких целей.

Цитата (DedMorozzz @ 1.05.2013 - 11:55)
тю, так тут вообще тривиальная задача

Не факт smile.gif Потому что UserID "непоймичтозапараметр"

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
S.Chushkin
Цитата (allplayer @ 1.05.2013 - 02:58)
Помогите правильно составить запрос. Мне нужно из БД получить только по одной последней записи каждого пользователя, прикрепленного к аккаунту #2

Что-то вроде (последние записи всех юзеров, по времени):
select t2.* from (select UserID, max(time) as maxtime from tb2 group by UserId) as t
left join tb2 as t2 on t2.UserID = t.UserID and t2.time = t.maxtime


п.с. Работоспособность не гарантирую, не проверял. Но думать/копать нужно в ту сторону.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
allplayer
Цитата (DedMorozzz @ 1.05.2013 - 10:50)
Переделай под себя. Делал похожу задачу. Необходимо выбрать 5 городов для каждой страны
отсортированых по ранку

$this->query("SET @a:=1");
  $this->query("SET @iso:=''");
     
  $sql = "SELECT
      q.*
      FROM (
      SELECT * FROM remake_town_city AS p
      WHERE rank>0
      ORDER BY country_iso ASC, rank DESC
      ) AS q
      WHERE
        (IF(@iso=q.country_iso, @a:=@a+1, ((@a:=1) AND (@iso:=q.country_iso))) <= 5)
      "
;
  $result = $this->query($sql);
 
  if ($result){
  $result_temp = array();
  foreach($result as $item){
    $result_temp[] = $item['q'];
  }
  $result = $result_temp;
  }
  return $result;


Но я не стану утверждать, что это самое оптимальное решение. Может попозже подробнее вникну

Очень понравился Ваш запрос. Полгода назад перешел на asp.net, да так на нем и остался. Быстрее он, да и безопаснее smile.gif. За SQL-запросы большое спасибо.Буду анализировать! Плюсики отправлю rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.