uscr 11.06.2013 16:03

Есть вопрос!Помогите составить запрос к БД удобный для обработки в php.

Здравствуйте! Имеется БД mysql с табличкой hardware.

Выглядит примерно так:

 1
2
3
4
5
6
7
8
9
10
11
|-----------------------------------|
| id | mac | region | status |
|-----------------------------------|
| 1 | ab | 0 | 0 |
|-----------------------------------|
| 2 | ba | 1 | 1 |
|-----------------------------------|
| 3 | ac | 0 | 3 |
|-----------------------------------|
| 4 | ca | 2 | 1 |
|-----------------------------------|


Записей, разумеется, гораздо больше.


Нужно из PHP на неком сайте вывести такую таблицу в которой будет видно, сколько железок в определённом статусе привязано к определённому региону, при этом обойтись как можно меньшим количеством запросов. Сейчас сделал такую табличку:

Статус1 Регион1 кол-во
Статус1 Регион2 кол-во
Статус1 Регион3 кол-во
Статус2 Регион1 кол-во
Статус2 Регион2 кол-во
Статус3 Регион3 кол-во

Нужно переделать её в человеческий вид:

1
2
3
4
          Регион1   Регион2   Регион3
Статус1 кол-во кол-во кол-во
Статус2 кол-во кол-во кол-во
Статус3 кол-во кол-во кол-во



Беда в том, что не знаю, как подступиться. Всё, что приходит на ум заставит делать чуть не по (кол-во регионов*кол-во статусов) запросов каждый раз, что непозволительно.


Сейчас моя "нечеловеческая таблица" рисуется вот таким кодом (запросы к БД отягощены JOIN'ами, но в целом понятно, что происходит. И не обращайте внимания на способ работы с БД. Тут так принято): pastebin.

То есть, выбираю все статусы и прохожусь по ним циклом. Для каждого статуса в цикле делаю запрос, который возвращает количество железок с таким статусом в каждом регионе. И во вложенном цикле рисую табличку.

Тащемта, вот так. Прошу мнений и советов.


Тэги:
+ 0 -
Похожие Поделиться

ananas 11.06.2013 18:24 #
через VIEW, не?
jh 11.06.2013 21:39 #
давненько не брал я в руки шашек...
лет 10.
вот что получилось
1
select id,mac,region as reg1, status as stat1,(select count(status) from hardware where stat1=status and reg1=region)  from hardware group by region,status order by status,region ;

jh 13.06.2013 12:41 #
поясню.
как я понял в таблице надо просто посчитать количество строк в которых равны регионы между собой и статусы между собой, это и делает мой запрос.
тестовую табличку я расширил
 1
2
3
4
5
6
7
8
9
10
11
12
+----+-----+--------+--------+
| id | mac | region | status |
+----+-----+--------+--------+
| 1 | ab | 0 | 0 |
| 2 | ba | 1 | 1 |
| 3 | ac | 3 | 0 |
| 4 | ca | 1 | 2 |
| 5 | fg | 0 | 2 |
| 6 | fr | 0 | 0 |
| 7 | tr | 0 | 0 |
| 8 | tr | 3 | 0 |
+----+-----+--------+--------+



результат запроса
1
2
3
4
5
6
7
8
9
+----+-----+------+-------+-------------------------------------------------------------------------+
| id | mac | reg1 | stat1 | (select count(status) from hardware where stat1=status and reg1=region) |
+----+-----+------+-------+-------------------------------------------------------------------------+
| 1 | ab | 0 | 0 | 3 |
| 3 | ac | 3 | 0 | 2 |
| 2 | ba | 1 | 1 | 1 |
| 5 | fg | 0 | 2 | 1 |
| 4 | ca | 1 | 2 | 1 |
+----+-----+------+-------+-------------------------------------------------------------------------+



все рассортировано по статусам и по регионам, осталось проверить на реальной табличке и приделать вывод в html.
jh 13.06.2013 12:52 #
для ускорения можно попробовать добавить составной индекс по полям region и status
uscr 13.06.2013 18:35 #
Использовал этот вариант. Переделал всё так, что бы с одной стороны легко было выводить в html (не люблю запутывать код просто) с другой - обойтись меньшим количеством запросов к БД.
Логика такая: выбираю все статусы. Выбираю все регионы. В цикле формирую первую строку таблицы (с регионами) в том-же цикле забиваю массив количеством приставок по каждому статусу в регионе. На выходе получается массив, к которому можно обращаться как counts[status][region]. Ну и дальше немного магии и получается красивая табличка.
Получилось <количество регионов> запросов на отрисовку страницы. Поскольку, регионов всего 3 и расширения не планируется, пока всё норм.
cppmm 13.06.2013 10:18 #
А не проще ли сортировку на php возложить? Дёрнуть из базы по статусу и потом в коде уже раскидать по регионам. Это, по-моему, менее накладно будет.
uscr 13.06.2013 12:37 #
Товарищи, всем спасибо за ответы. Сейчас немного разгребусь с текучкой и попробую что-нибудь сделать. К верному направлению вы меня подтолкнули.