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

#1 3 января 2014 в 23:40
Существует две таблицы в БД: ps_c_plr_data и ps_plr_ids_name
Мне нужно сделать две выборки по очереди, а не сразу.

Делаем выборки из первой таблице:
  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);
Выводим список из первой таблице:
  1.  
  2. echo'
  3. <table class="table1" width="550" align="center" bgcolor="#F4F4F4">
  4. <tr bgcolor="#8C8C8C">
  5. <th width="50" align="center">#</th>
  6. <th width="300" align="center">Игрок</th>
  7. <th width="100" align="center">Статистика</th>
  8. </tr>
  9. ';
  10.  
  11. $i=1;
  12. while($row = mysql_fetch_array($res))
  13. {
  14. $plrid = $row['plrid'];
  15. $kills = $row['kills'];
  16. $deaths = $row['deaths'];
  17.  
  18. echo'<tr><td>'.$i;
  19. echo'</td><td>'.$name; // не знаю как сделать выборки имени...
  20. echo'</td><td align="center">';
  21. echo $kills;
  22. echo'-';
  23. echo $deaths;
  24. echo'</td></tr>';
  25. $i++;
  26. }
  27.  
  28. echo'</table>';
  29. ?>
  30.  
Далее нам надо сделать ещё одну выборку, но уже из второй таблице и связать её с первой выборкой:
  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);
Как это сделать?
#2 3 января 2014 в 23:54
Так зачем разделять запросы? Делайте в объединенном запросе.
  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.  
#3 3 января 2014 в 23:56
Марат, дело в том, что мне надо сначала сделать выборку с первой таблицу по d.kills, вывести это, и потом сделать выборку имени n.name по количеству подключений totaluses и вывести это в массив, в противном случаи две выборки сразу сделать невозможно, наверное…
#4 4 января 2014 в 00:03
Объясню немного понятнее: таблица с именами содержит prlid, name, totaluses; в этой таблице могут быть одинаковые plrid, по которым мы определяем нужное имя, то есть WHERE plrid=$plrid(из 1-ой таблицы), далее там надо ORDER BY totaluses DESC сделать.
Можно ли это сделать всё в LEFT JOIN, при этом должна главная выборка быть ORDER BY kills DESC limit 10
#5 4 января 2014 в 00:24
Можно так:
  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.  
Только нужно учесть, что в выборке будет больше строк и в цикле не выводить дубликаты.
Ну если вам нравится, можете делать и в цикле второй запрос. Только не думаю, что это гуд.
#6 4 января 2014 в 00:29
Марат, нет, это не то, получается сейчас цикл зависит от kills и totaluses, то есть выбирается с первой таблице наибольшее значение kills и со второй выбирается наибольшее значение totaluses и они вместе объединяются и выводятся.
Мне же надо сделать выборку с первой таблица, допустим с первой таблице выбралось 10 строк, впихиваем это в массив и уже берём из этих 10 строк plrid и делаем выборку name по totaluses desc...

Я думаю с LEFT JOIN так как я хочу — не получится.
Надо вторую выборку делать уже в массиве.
Подскажите, как это сделать? Опираясь на первый пост.
#7 4 января 2014 в 00:32
На крайний случай есть ещё GROUP BY, где кстати можно применять и сортировку ASC|DESC и плюс ещё по сгруппированным строкам ещё пройтись ORDER BY.
Всё равно результат лучше получить в одном запросе, а далее уже думать о нужном выводе.
Так что, методом эксперементального тыка… :=)
#8 4 января 2014 в 00:34
Марат, я всё это пробовал, нифега не получилось… Вот хочу попробовать в два запроса, но не знаю как это сделать…
#9 4 января 2014 в 00:41
Ну, если уже так нужно, то вставьте второй запрос в цикл:
  1.  
  2. <?php
  3. echo'
  4. <table class="table1" width="550" align="center" bgcolor="#F4F4F4">
  5. <tr bgcolor="#8C8C8C">
  6. <th width="50" align="center">#</th>
  7. <th width="300" align="center">Игрок</th>
  8. <th width="100" align="center">Статистика</th>
  9. </tr>
  10. ';
  11.  
  12. $i=1;
  13. while($row = mysql_fetch_array($res))
  14. {
  15. $plrid = $row['plrid'];
  16. $kills = $row['kills'];
  17. $deaths = $row['deaths'];
  18.  
  19. echo'<tr><td>'.$i;
  20. echo'</td><td>';
  21. //здесь сам запрос
  22. $query_2 = "SELECT name FROM ps_plr_ids_name WHERE plrid={$plrid} ORDER BY totaluses DESC
  23. LIMIT 10";
  24. $res_2 = mysql_query($query_2);
  25. //далее обрабатываем полученный массив
  26. if(num_rows($res_2){
  27. while($row_2 = mysql_fetch_array($res_2)){
  28. echo $row_2['name'].'<br>';
  29. }
  30. }
  31. echo'</td><td align="center">';
  32. echo $kills;
  33. echo'-';
  34. echo $deaths;
  35. echo'</td></tr>';
  36. $i++;
  37. }
  38.  
  39. echo'</table>';
  40. ?>
  41.  
#10 4 января 2014 в 00:46
Сорри если не в тему, все читать и разбираться лень. Так не пробовали?
  1. SELECT name FROM ps_plr_ids_name WHERE plrid IN(SELECT бла-бла-бла) ORDER BY totaluses DESC
  2. LIMIT 10"
#11 4 января 2014 в 00:51
ByFly, чтобы как то вам помочь необходимо видеть структуры таблиц, их связи, понятное объяснение что вы хотите в итоге получить. Скорее всего изначально не верно спроектировали.
#12 4 января 2014 в 02:17
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"
#13 4 января 2014 в 02:21

Сорри если не в тему, все читать и разбираться лень. Так не пробовали?

Pasha
Дело в том, что основная таблица предыдущая и она выводится в массив без "name". К этому массиму мы должны добавить "name".
#14 4 января 2014 в 02:34

Ну, если уже так нужно, то вставьте второй запрос в цикл:
Спойлер

Марат
По логике нам второй массив не нужен.
С массивом — вообще не работает.
Без массива — не работает отображение name и вообще не знаю работает ли sql запрос…
#15 4 января 2014 в 09:11

С массивом — вообще не работает.
Без массива — не работает отображение name и вообще не знаю работает ли sql запрос...

ByFly
Да. Ошибочка. Замените
  1. if(num_rows($res_2){
на
  1. if(mysql_num_rows($res_2){
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.