Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: составить запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » составить запрос

Страниц (1): [1]
 

1. DlTA - 10 Апреля, 2013 - 16:59:13 - перейти к сообщению
имеется табличка
id | level | group
где
level [0,1] может быть
group - равно своему id или родительскому
при этом если group равно родительскому то level=1
если своему то level=0

пример
1|0|1 -корневой
2|1|1 -подконекчен к 1
3|0|3 - корневой
4|1|1 - к первому
5|1|3 - к третьему

теперь нужен запрос
выбирающей все с level=0
и по одному с level=1 для каждой группы
то есть на выходе должно быть
1|0|1
2|1|1
3|0|3
5|1|3

строка (4|1|1) не нужна так как она для группы 1 будет второй с level=1

можно ли это все сделать одним достаточно быстрым запросом?
2. LIME - 10 Апреля, 2013 - 18:55:16 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM tbl WHERE lvl=0
  2. UNION
  3. SELECT * FROM tbl WHERE lvl=1 GROUP BY `group`

?
3. OrmaJever - 10 Апреля, 2013 - 19:15:27 - перейти к сообщению
чёта я сомневаюсь в нужности поля level Растерялся
Ведь можно узнать корневая или нет категория и таким образом
id = group - корневая
id != group - потомок
4. DlTA - 10 Апреля, 2013 - 23:37:18 - перейти к сообщению
LIME пишет:
SELECT * FROM tbl WHERE lvl=0
UNION
SELECT * FROM tbl WHERE lvl=1 GROUP BY `group`
не совсем, насколько я понял будут выбраны все с нулевым уровнем, а к каждому из них будут добавлены соответствующей группы уровнем 1
НО
не факт что это будут элементы взятые с учетом сортировки по id (да добавить сортировку не проблема)

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


OrmaJever пишет:
чёта я сомневаюсь в нужности поля level
на размер базы эта избыточность сильно не влияет, но зато походу очень пригодится как дополнительный индекс, ну и вообще в умных книжках пишут что не желательно юзать переменные с множественным назначением (как то так)
(Добавление)
чет у меня тут мысли пришли что наверное придется перекроить немного

и сделать чтоб level (или как то ее иначе теперь обозвать) имело назначение в виде порядкового номера в группе
тоесть корневой эемент будет иметь уровень 0, все последующие в этой же группе ++

и выборка примерно будет иметь вид
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table`
  2. WHERE
  3.  `level`<2 // или 3 или что там надо
  4. ORDER BY `group` ASC, `id` ASC


хотя вот что делать если нужны не начальные элементы, а конечные
тоесть выбрать все с уровнем 0 и для каждого из них несколько последних добавленных??
5. Redya69 - 16 Апреля, 2013 - 11:45:55 - перейти к сообщению
Подскажите как назначить первичному индексу значение, с которого начинать считать.
При создании он начинает с 1. Мне нужно, к примеру, со 100.
6. Мелкий - 16 Апреля, 2013 - 12:15:28 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE t2 AUTO_INCREMENT = 100;

http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]alter-table[dot]html

 

Powered by ExBB FM 1.0 RC1