|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
Помощ за sql заявка
|
|
Автор |
todor68O8 (непознат
) |
Публикувано | 28.07.09 12:57 |
|
Ако може малко помощ за следната SQL заявка.
Имам таблица под MySQL - 5.0.32-Debian_7etch10-log
CREATE TABLE `classes` (
`id` int(4) NOT NULL auto_increment,
`id_name` varchar(20) NOT NULL,
`parent_name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=184 ;
id_name | parent_name
-------------------------------
1:1 | 0
1:32 | 1:1
1:33 | 1:1
1:34 | 1:32
1:35 | 1:32
1:36 | 1:33
1:37 | 1:34
1:39 | 1:1
1:40 | 1:1
...
</pre></font>
Ta каква заявка да направя че таблицата да ми излиза в този вид
id_name | parent_name
-------------------------------
1:1 | 0
1:32 | 1:1
1:34 | 1:32
1:35 | 1:32
1:37 | 1:34
1:33 | 1:1
1:36 | 1:33
1:39 | 1:1
1:40 | 1:1
....
т.е. да се сортира първо колона id_name, и след това всички parent_name които са равни на придишното id_name
Редактирано от todor68O8 на 28.07.09 14:06.
| |
|
Май ще е нещо такова
SELECT *
FROM classes
WHERE parent_name = any(SELECT id_name FROM classes)
Редактирано от todor68O8 на 28.07.09 15:41.
| |
Тема
|
Re: Помощ за sql заявка
[re: todor68O8]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 28.07.09 21:02 |
|
Ако MySQL поддържа Common Table Extensions ще стане относително лесно. Иначе за тази йерархия трябва цикъл някой да върти -- клиентския код или със SQL.
cheers,
</wqw>
| |
Тема
|
Re: Помощ за sql заявка
[re: todor68O8]
|
|
Автор |
salle (един такъв) |
Публикувано | 29.07.09 18:11 |
|
Межу другото идеята да съхраняваш стойности като x:y не е никак добра поради много причини.
Ако това са истинските данни частта "1:" е напълно излишна. Ако не са то тогава разбий въпросната двойка x:y на две колонки.
| |
Тема
|
Re: Помощ за sql заявка
[re: todor68O8]
|
|
Автор |
salle (един такъв) |
Публикувано | 29.07.09 18:16 |
|
Дефинирай "равни на предишното id_name" и ще се сетиш как става. Не забравяй обаче, че ти трябва ORDER BY клауза. Без нея сървърът е свободен да ти върне резултата в произволен ред.
| |
Тема
|
Re: Помощ за sql заявка
[re: salle]
|
|
Автор |
todor68O8 (непознат
) |
Публикувано | 01.08.09 15:16 |
|
Цялата задачата дойде от това че искам да направя web базиран интерфейс на tc-htb
http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm
Там най-общо се работи с класове който имат свой родители и свой деца, най образно казано
И всеки клас може да има също свой под класове
Приемам че най добре е да има колона родител /да е наречем id), и колона дете(да е наречем id_parent)
и тука възникна въпроса с mysql заявките
Но мисля че донякъде се справиш:
SELECT PARENT.name AS 'Root-Class', CHILD.name AS 'Child-Class', CHILD.rate AS Rate, CHILD.ceil AS Ceil, CHILD.burst AS Burst, CHILD.prio AS Prio, CHILD.monitor AS Monitor
FROM classes AS PARENT, classes AS CHILD
WHERE PARENT.id = CHILD.id_parent
AND PARENT.id_interfaces =10
таблица: classes
CREATE TABLE `classes` (
`id` int(4) NOT NULL auto_increment,
`id_interfaces` int(3) NOT NULL,
`name` varchar(254) NOT NULL,
`leaf` varchar(3) NOT NULL default 'sfq',
`rate` varchar(20) NOT NULL,
`ceil` varchar(20) NOT NULL,
`burst` varchar(10) default NULL,
`prio` varchar(1) NOT NULL default '3',
`id_parent` int(4) NOT NULL,
`monitor` int(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=184 ;
id - e уникалния номер на класа
id_parent - е номера на родителя към който принадлежи
Другите колони са за различни стойности
Та въпроса е как да се сортира таблицата та да се наредят класовете подредени, с техните под класове.
И ако изтърка един клас как да се изтъркат всички негови под класове.
Абе опашата задача Редактирано от todor68O8 на 01.08.09 15:21.
| |
Тема
|
Re: Помощ за sql заявка
[re: salle]
|
|
Автор |
salle (един такъв) |
Публикувано | 01.08.09 15:27 |
|
Да поясня. Като казваш "равни на предишното" не стават ясни много неща.
Преишното по какъв признак? Да речем, че говорим за поредица от числа. Има съществена разлика дали поредицате е непрекъстната.
Предишното на 5 например 4 ли е или "най-голямото число по-малко от 4"
Освен това от структурата на таблицата ти следва, че може да има повторения в поредицата т.е. да имаш 1,2,3,4,4,5. В този случай кое е "предишното на 5"? Ако става въпрос само за сортиране не е проблем разбира се да сортилаш двете четворки заедно.
И разбира се използвай INT
Ето един пример за дървовидна структура. Дефиницията на таблицата определя, че всеки елемент има само един "родител", но може да има много "наследници"
CREATE TABLE `class` (
`id` int(10) unsigned NOT NULL auto_increment,
`parent_id` int(10) unsigned default NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
);
INSERT INTO class (parent_id) VALUES (0), (1), (2), (3), (1);
До сортираме по id и parent_id поотделно:
SELECT * FROM class ORDER BY id;
+----+-----------+
| id | parent_id |
+----+-----------+
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 1 |
+----+-----------+
SELECT * FROM class ORDER BY parent_id;
+----+-----------+
| id | parent_id |
+----+-----------+
| 1 | 0 |
| 2 | 1 |
| 5 | 1 |
| 3 | 2 |
| 4 | 3 |
+----+-----------+
Кажи сега при този резултат как да дефинираме задачката.
| |
Тема
|
Re: Помощ за sql заявка
[re: todor68O8]
|
|
Автор |
salle (един такъв) |
Публикувано | 01.08.09 15:54 |
|
"Та въпроса е как да се сортира таблицата та да се наредят класовете подредени, с техните под класове. "
SELECT ... ORDER BY id, parent_id;
Редактирано от salle на 01.08.09 15:54.
| |
Тема
|
Re: Помощ за sql заявка
[re: salle]
|
|
Автор |
salle (един такъв) |
Публикувано | 01.08.09 15:55 |
|
така де, обратното parent_id, id :)
| |
Тема
|
Re: Помощ за sql заявка
[re: salle]
|
|
Автор |
salle (един такъв) |
Публикувано | 01.08.09 16:02 |
|
Ето го и примера за "подредени с техните подкласове"
SELECT c1.id parent, c2.id child FROM class c1 LEFT JOIN class c2 ON c1.id = c2.parent_id ORDER BY c1.id, c2.id;
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|