Datuve :: Forums :: Arhīvs :: sql vaicājums - kārtošana

Datuve

Mana Datuve

Reģistrācija | Noteikumi | Paroles atjaunošana



Forums

Ieskaties


Raksti

Lietotāji online

Lietotāji online: 74

Reģistrētie lietotāji online: 0

Viesi online: 74

Datuve.lv video
Top.LV

sql vaicājums - kārtošana

Ievietoja: coderpp @ 2009.06.14 21:51  

Piemēram man ir tabula ar šādiem laukiem - lauks1 | lauks2 | lauks 3

Šī tabula satur šādus datus:
1 | 0 | abcd
2 | 0 | abcdefg
3 | 0 | qwert
4 | 1 | ertyu
5 | 2 | uiop
6 | 2 | poiu

Man šos datus vajadzētu dabūt šādā secībā:
1 | 0 | abcd
4 | 1 | ertyu
2 | 0 | abcdefg
5 | 2 | uiop
6 | 2 | poiu
3 | 0 | qwert

Vai ir iespējams uzrakstīt vaicājumu, kurā dati tiek sakārtoti tādā veidā? Nepieciešams, lai ieraksti, kur lauks2 satur lauks1 vērtību atrodas tieši aiz šī ieraksta.

Komentāri:

#1 siicis @ 2009.06.14 22:38

Manuprāt, ar vienu selectu to nevar dabūt ārā.
Man ir izvēlnes skripts kurš dara tevis nosaukto lietu. Izlasi deīgo nno tā pats:
 $pid_list = array($id);
 // dabūnam visus parentus

 while ($id)
 { // kamēr id nav 0, ...
   $res = kverijs("SELECT pid FROM $kop WHERE id = {$id} limit 1");
   $row = mysql_fetch_row($res);
   mysql_free_result($res); // PHP5 nepatīk, ja netiek atbrīvota mysql resursu aizņemtā atmiņa.
   if (!$row) { break; } // nepareizs id (ja manuāli ierakstīts URL, piemēram)
   $id = $row[0];
   $pid_list[] = $id;
 }
 $pid_list = implode(',', $pid_list);
 $res = kverijs("SELECT pid, id, nosaukums_".$valoda." AS nosaukums FROM $kop WHERE go='0' AND akt='0' AND pid IN ({$pid_list}) ORDER BY $kop.kart");
 global $toc;
 while ( $row = mysql_fetch_assoc($res) )
 {
   $toc[$row['pid']][] = array('id' => $row['id'], 'nosaukums' => $row['nosaukums']);
 }
 mysql_free_result($res);

un
function ShowChilds ( $valoda, $pid)
//function ShowChilds ( $valoda, $pid, $level = 0 )JA VAJAG LAI ATDALĪTOS AR ATSTAPĒM
{
global $toc;
   
foreach ( $toc[$pid] as $elem )
{
//$indent = str_repeat('  ', $level); JA VAJAG LAI ATDALĪTOS AR ATSTAPĒM
echo "<li><a href='index.php?".$valoda."id={$elem['id']}' class='izvelne'>{$elem['nosaukums']}</a>";
//echo "<li>{$indent}<a href='index.php?".$valoda."id={$elem['id']}' class='izvelne'>{$elem['nosaukums']}</a></li>";JA VAJAG LAI ATDALĪTOS AR ATSTAPĒM
if (isset($toc[$elem['id']]))
{ echo '<ul class="izvelne">'; ShowChilds($valoda,$elem['id']); echo '</ul>';} //ShowChilds($valoda,$elem['id'], $level + 1);JA VAJAG LAI ATDALĪTOS AR ATSTAPĒM
echo '</li>';
// <li>bla</li> vai <li>bal<ul><li>bla-apaks</li></ul></li>
}

}

#2 coderpp @ 2009.06.14 22:53

Ja nevar, ta nevar. Uzrakstīt ko līdzīgu tavam nebūs grūti, vienkārši domāju, ka mož to var izdarīt ērtāk uzrakstot vienu selectu, bet sarežģitāku.
Paldies par to pašu.

#3 alijs @ 2009.06.16 22:19

Kāpēc tad nevar? Var ar vienu selectu. :)

Ja paskatamies, vajadzīgā secība ir:
1 | 0 | abcd
4 | 1 | ertyu
2 | 0 | abcdefg
5 | 2 | uiop
6 | 2 | poiu
3 | 0 | qwert

Apmainot dažiem laukiem lauks1 ar lauks2 vietām (nav grūti saprast, pēc kāda algoritma), iegūstam:
1 | 0 | abcd
1 | 4 | ertyu
2 | 0 | abcdefg
2 | 5 | uiop
2 | 6 | poiu
3 | 0 | qwert
Te jau ir skaidrs, kā aptuveni jāizskatās selectam ;)

Rekur ir aptuvens selects:
select lauks1, lauks2, lauks3 from (select lauks1, lauks2, lauks3 , (case when lauks2 not in (select lauks1 from tabula) then lauks1||lauks2 else lauks2||lauks1 end) as temp from tabula) order by temp;

Selects ir principā priekš Oracle (jo ar to vairāk darbojos), slinkums priekš mysql pārrakstīt, bet galvenais gribēju ideju parādīt.

#4 Ravage @ 2009.06.17 08:50

Izskatās pēc nepareizas db struktūras... tad tagad nebūtu jādomā visādi kreisi vipedroni...

#5 sn1per @ 2009.06.17 12:33

orāklī strādās šādi:

select
case when lauks2 < lauks1 then lauks2 else lauks1 end as order_lauks,
t.*
from tabula t
order by order_lauks, lauks1