Сортировка динамического массива (двумерного)

x-yuri

Новичок
я понимаю это, через использование join делается?
да, но сортировать в mysql однозначно быстрее для больших объемов и при условии использования индексов
 

Nemozar

Новичок
Если не сложно, напиши пож приблизительный запрос для получения данных. просто я сидел крутил с join Так и не вышло :( я до этого не пользовался им...
 

dimagolov

Новичок
[offtopic]
этот топик напомнил один старый фильм, "Горячие головы". Там один герой говорил:
мне нужна сложная операция на глазах, но так как она очень опасная, то ее делают через задний проход, а я туда ни одного мужика не подпускаю.
[/offtopic]
 

Nemozar

Новичок
пишу примитивный запрос...

SELECT * FROM azov_time WHERE id_zad = (SELECT id_zad FROM azov_zad WHERE id_game =1 )

и выдает ошибку
#1242 - Subquery returns more than 1 row

с подзапросами раньше не работал... в чем моя ошибка?

-~{}~ 08.02.09 17:43:

Нашел решение, надо было добавить перед подзапросом оператор ANY :)
 

Balancer

Новичок
Запрос возвращает более одной строки. И mysql в where не может понять с чем сравнивать. Если возможно множество значений, то переформулировать нужно как:

SELECT * FROM azov_time WHERE id_zad IN (SELECT id_zad FROM azov_zad WHERE id_game =1)

Или ограничить число строк результата в подзапросе:

SELECT * FROM azov_time WHERE id_zad = (SELECT id_zad FROM azov_zad WHERE id_game =1 LIMIT 1)
 

dimagolov

Новичок
Nemozar, Balancer, не нужно так делать. потому что так подзапрос будет выполняться столько раз, сколько строк в таблице azov_time.

PHP:
SELECT azov_time.* 
FROM azov_time 
INNER JOIN azov_zad ON azov_zad.id_zad = azov_time.id_zad
WHERE id_game =1
 

Balancer

Новичок
Естественно, что INNER JOIN намного быстрее. Я просто ответил на конкретный вопрос Nemozar.
 

dimagolov

Новичок
Balancer, учись не отвечать на конкретный ДУРАЦКИЙ вопрос а давать полезный совет или подсказку. и читай темы с начала и внимательно, иначе жевать дирол, ОК?
 

Nemozar

Новичок
SELECT azov_all_com.name,azov_time.time, azov_zad.name
FROM azov_time
INNER JOIN azov_zad ON azov_zad.id_zad = azov_time.id_zad
INNER JOIN azov_all_com ON azov_all_com.id = azov_time.id_com
WHERE id_game =1

пытаюсь в таблице вывести еще нормальное название команды (azov_all_com.name), но тогда почему то только одна команда обрабатывается (остальные поля почему то не входят). Сори за такие вопросы, просто джоинги что то не даются мне...
 

dimagolov

Новичок
Nemozar, у тебя отображаются только те команды, для которых id_game =1. А должно быть как-то иначе?

-~{}~ 08.02.09 15:47:

ремарка про преимущество JOIN над подзапросами
Автор оригинала: Balancer
Естественно, что INNER JOIN намного быстрее. Я просто ответил на конкретный вопрос Nemozar.
чтобы реально было правильно и быстро, надо чтобы поля, по которым происходит связывания должны быть проиндексированными.
 

Nemozar

Новичок
нет, с одним джоингом у меня отобраются 4 строчки (две команды у которых id_game =1)
при двух отображается 2 строчки (одной команды)

пример 1
id_com time name
15 11:00 zad 1
15 22:00 zad 2
16 55:00 zad 1
16 33:00 zad 2

пример 2
name time name
R.P.M. x1000 11:00 zad 1
R.P.M. x1000 22:00 zad 2
 

Nemozar

Новичок
Автор оригинала: dimagolov
это значит, что для команды 16 нету записи в таблице azov_all_com
ошибся при вставке :) норм работает...

name time name
R.P.M. x1000 11:00 zad 1
R.P.M. x1000 22:00 zad 2
CraZy KiDs 55:00 zad 1
CraZy KiDs 33:00 zad 2

а как теперь можно создать, что бы время разбилось по столбцам (и столбцы назвать согласно полю name)

пример таблицы
name zad1 zad2
R.P.M. x1000 11:00 22:00
CraZy KiDs 55:00 33:00
 

dimagolov

Новичок
заданий, как я понимаю, переменное кол-во?
вот именно это, то есть форматирование вывода стоит делать средствами php, потому как у тебя выходит переменное кол-во колонок. что плохо уживается с SQL. то есть строить массив пробегая по полученным из запроса данным и устанавливать соответствующие ячейки.

п.с. имя команды я бы сделал ключем результирующего массива.
 

Nemozar

Новичок
и про ключ... это то поле, ко которому будет проходить сортировка? Но мне (иначально) нужно было, что бы сортировка шла, по времени выбранного задания!

а тут, как я понимаю, не получится отсортировать, т.к. данные о времени каждой команды на разных заданиях хранятся в перемешку...

т.е.
по выбору задания идет сортировка всей таблицы...
 

dimagolov

Новичок
сделай 2 запроса. 1-й, который давал бы информацию обо всех командах и готовил бы общий массив данных
array ('command1' => array (time1, tima2,...), 'command1' => array (time1, tima2,...), ...)
и второй, который бы сортировал команды по выбранным критериям. по результатам второго запроса отображай уже результаты в html из массива используя полученный порядок.
 

Nemozar

Новичок
а как в вышенаписаном запрос сделать сортировку по номеру задания?..

или про сортировку массива ты говоришь? (полученного по общему запросу)
 

x-yuri

Новичок
а как в вышенаписаном запрос сделать сортировку по номеру задания?..
тебе же по времени надо сортировать? Джойниш azov_time и azov_all_com при заданном id_zad и ORDER BY time

-~{}~ 08.02.09 23:07:

п.с. имя команды я бы сделал ключем результирующего массива.
dimagolov а почему не id команды?

и почему 1м запросом не узнать количество заданий, а 2м -получить всю информацию в готовом виде?
 

dimagolov

Новичок
Автор оригинала: x-yuri
dimagolov а почему не id команды?
можно и по id. дело вкуса.

Автор оригинала: x-yuri
и почему 1м запросом не узнать количество заданий, а 2м -получить всю информацию в готовом виде?
1. потому что все равно 2 запроса и ты ничего не выигрываешь, а проигрываешь в сложности запросов (см. ниже)
2. потому что это весьма нетривиально (узнать количество заданий, по крайней мере из инфы о прохождении их командами), так как (это что-то типа квеста, как я понял), каждая конкретная команда (и даже все команды) может выполнить не все задания, а только часть. ну и 2-й запрос в этом случае придется строить динамически, что ТС-у явно не по силам.
 
Сверху