Помогите, SQL, двойная выборка

 
Посетитель
small user social cms
Медаль
Сообщений: 164
Существует две таблицы в БД: ps_c_plr_data и ps_plr_ids_name
Мне нужно сделать две выборки по очереди, а не сразу.

Делаем выборки из первой таблице:
Код PHP:
  1.  
  2. <?
  3. $query = "SELECT plrid, kills, deaths FROM ps_c_plr_data ORDER BY kills DESC
  4. LIMIT 10";
  5. $res = mysql_query($query);
Выводим список из первой таблице:
Спойлер
Далее нам надо сделать ещё одну выборку, но уже из второй таблице и связать её с первой выборкой:
Код PHP:
  1.  
  2. <?
  3. $query = "SELECT name FROM ps_plr_ids_name WHERE plrid=$plrid ORDER BY totaluses DESC
  4. LIMIT 10";
  5. $res = mysql_query($query);
Как это сделать?
Модератор
small user social cms
МедальКубок зрительских симпатийПочетный донор проекта
Сообщений: 964
Так зачем разделять запросы? Делайте в объединенном запросе.
Код PHP:
  1.  
  2. $query = "SELECT d.plrid, d.kills, d.deaths, n.name
  3. FROM ps_c_plr_data d
  4. LEFT JOIN ps_plr_ids_name n ON n.plrid = d.plrid
  5. ORDER BY kills DESC
  6. LIMIT 10";
  7.  
Хватит париться, живи как нравится!
Реклама
cms
Посетитель
small user social cms
Медаль
Сообщений: 164
Марат, дело в том, что мне надо сначала сделать выборку с первой таблицу по d.kills, вывести это, и потом сделать выборку имени n.name по количеству подключений totaluses и вывести это в массив, в противном случаи две выборки сразу сделать невозможно, наверное....
Посетитель
small user social cms
Медаль
Сообщений: 164
Объясню немного понятнее: таблица с именами содержит prlid, name, totaluses; в этой таблице могут быть одинаковые plrid, по которым мы определяем нужное имя, то есть WHERE plrid=$plrid(из 1-ой таблицы), далее там надо ORDER BY totaluses DESC сделать.
Можно ли это сделать всё в LEFT JOIN, при этом должна главная выборка быть ORDER BY kills DESC limit 10
Модератор
small user social cms
МедальКубок зрительских симпатийПочетный донор проекта
Сообщений: 964
Можно так:
Код PHP:
  1.  
  2. $query = "SELECT d.plrid, d.kills, d.deaths, n.name
  3. FROM ps_c_plr_data d
  4. LEFT JOIN ps_plr_ids_name n ON n.plrid = d.plrid
  5. ORDER BY d.kills DESC, n.totaluses DESC";
  6.  
Только нужно учесть, что в выборке будет больше строк и в цикле не выводить дубликаты.
Ну если вам нравится, можете делать и в цикле второй запрос. Только не думаю, что это гуд.
Хватит париться, живи как нравится!
Посетитель
small user social cms
Медаль
Сообщений: 164
Марат, нет, это не то, получается сейчас цикл зависит от kills и totaluses, то есть выбирается с первой таблице наибольшее значение kills и со второй выбирается наибольшее значение totaluses и они вместе объединяются и выводятся.
Мне же надо сделать выборку с первой таблица, допустим с первой таблице выбралось 10 строк, впихиваем это в массив и уже берём из этих 10 строк plrid и делаем выборку name по totaluses desc...

Я думаю с LEFT JOIN так как я хочу - не получится.
Надо вторую выборку делать уже в массиве.
Подскажите, как это сделать? Опираясь на первый пост.
Модератор
small user social cms
МедальКубок зрительских симпатийПочетный донор проекта
Сообщений: 964
На крайний случай есть ещё GROUP BY, где кстати можно применять и сортировку ASC|DESC и плюс ещё по сгруппированным строкам ещё пройтись ORDER BY.
Всё равно результат лучше получить в одном запросе, а далее уже думать о нужном выводе.
Так что, методом эксперементального тыка... :=)
Хватит париться, живи как нравится!
Посетитель
small user social cms
Медаль
Сообщений: 164
Марат, я всё это пробовал, нифега не получилось... Вот хочу попробовать в два запроса, но не знаю как это сделать...
Редактировалось: 1 раз (Последний: 4 января 2014 в 00:34)
Модератор
small user social cms
МедальКубок зрительских симпатийПочетный донор проекта
Сообщений: 964
Ну, если уже так нужно, то вставьте второй запрос в цикл:
Спойлер
Редактировалось: 2 раз (Последний: 4 января 2014 в 00:44)
Хватит париться, живи как нравится!
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 692
Сорри если не в тему, все читать и разбираться лень. Так не пробовали?
Код PHP:
  1. SELECT name FROM ps_plr_ids_name WHERE plrid IN(SELECT бла-бла-бла) ORDER BY totaluses DESC
  2. LIMIT 10"
Skype: pasha--g
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4388
ByFly, чтобы как то вам помочь необходимо видеть структуры таблиц, их связи, понятное объяснение что вы хотите в итоге получить. Скорее всего изначально не верно спроектировали.
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
Медаль
Сообщений: 164
Fuze, вообщем это отдельный америкосовский скрипт, они как я вижу не блещут мозгами)))
Чтобы объяснить то, что я хочу, это надо нарисовать, я попытался нарисовать, но всё как-то криво вышло...

Есть одна таблица, мы делаем выборку и вывод из этой таблице 10 строк, далее к этим 10-тью строкам нам надо добавить Имя, имя берётся из другой таблице.
Данные таблицы связаны с онлайн игрой, то есть человек зашёл под одним ником, поменял ник, и играет под другим.
Определение всех данных об игроки идёт через уникальный код игры.
Получается, что существует основная первая таблица, содержащая "plrid", далее идёт определение других параметров через "plrid".
Вторая таблица содержит "plrid", "name", "totaluses". То есть в таблице несколько записей одного и того же "plrid".
"totaluses" - отвечает за количество игр, проведённых под тем или иным игровым ником, то есть "name"

Допустим в первой таблице 3 строки "plrid" "kills" "deaths"
"1" "10 "5"
"2" "30" "15"
"3" "50" "25"
Выводим эти строчки ORDER BY "kills" DESC LIMIT 3

Заносим это в массив.
Выводятся эти данные.

Теперь к этим данным надо ещё дописать "name", то есть игровой ник, под которым чаще всего играл игрок.
Select name FROM ... WHERE plrid*=plrid** // где plrid* это id игрока, выведенное из массива; plrid** - ищем такой же номер во второй таблице
ORDERED BY totaluses DESC - сортируем по количеству, нам нужно вывести то имя, под которым игрок больше всего играл.

В итоге должно получиться: "name", "kills", "deaths"
"Вася" "50" "25"
"Игорь" "30" "15"
"Gamer" "10" "5"
Редактировалось: 1 раз (Последний: 4 января 2014 в 02:19)
Посетитель
small user social cms
Медаль
Сообщений: 164
Pasha:
Сорри если не в тему, все читать и разбираться лень. Так не пробовали?
Дело в том, что основная таблица предыдущая и она выводится в массив без "name". К этому массиму мы должны добавить "name".
Посетитель
small user social cms
Медаль
Сообщений: 164
Марат:
Ну, если уже так нужно, то вставьте второй запрос в цикл:
Спойлер
По логике нам второй массив не нужен.
С массивом - вообще не работает.
Без массива - не работает отображение name и вообще не знаю работает ли sql запрос...
Модератор
small user social cms
МедальКубок зрительских симпатийПочетный донор проекта
Сообщений: 964
ByFly:
С массивом - вообще не работает.
Без массива - не работает отображение name и вообще не знаю работает ли sql запрос...
Да. Ошибочка. Замените
Код PHP:
  1. if(num_rows($res_2){
на
Код PHP:
  1. if(mysql_num_rows($res_2){
Хватит париться, живи как нравится!
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.