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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: составить запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: подкиньте идею
DlTA
Отправлено: 10 Апреля, 2013 - 16:59:13
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




имеется табличка
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

можно ли это все сделать одним достаточно быстрым запросом?
 
 Top
LIME
Отправлено: 10 Апреля, 2013 - 18:55:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM tbl WHERE lvl=0
  2. UNION
  3. SELECT * FROM tbl WHERE lvl=1 GROUP BY `group`

?
 
 Top
OrmaJever
Отправлено: 10 Апреля, 2013 - 19:15:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




чёта я сомневаюсь в нужности поля level Растерялся
Ведь можно узнать корневая или нет категория и таким образом
id = group - корневая
id != group - потомок


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 10 Апреля, 2013 - 23:37:18
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




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 и для каждого из них несколько последних добавленных??

(Отредактировано автором: 10 Апреля, 2013 - 23:37:51)

 
 Top
Redya69
Отправлено: 16 Апреля, 2013 - 11:45:55
Post Id


Новичок


Покинул форум
Сообщений всего: 23
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)

[+]


Подскажите как назначить первичному индексу значение, с которого начинать считать.
При создании он начинает с 1. Мне нужно, к примеру, со 100.
 
 Top
Мелкий Супермодератор
Отправлено: 16 Апреля, 2013 - 12:15:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE t2 AUTO_INCREMENT = 100;

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB