[php/mysql] probleem grote query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik heb 2 tabellen. 1 tabel met links en 1 tabel met categorieen. Nu wil ik een lijstje maken met een categorie titel en daaronder de bijbehorende links, echter kunnen er ook links zijn die niet in een categorie zitten. Deze moeten dan bij de categorie Algemeen komen en bovenaan staan. De links die niet in een categorie staan hebben als categorieid 0:

Algemeen
- link 1
- link 2

Categorie 1
- link 1
- link 2

Categorie 2
- link 1
- link 2

Om een lijstje te maken is het probleem niet. Maar nu hebben de categorieen ook nog een veld "positie". Het probleem zit hem nu in het ordenen op deze positie.

PHP:
1
SELECT link.id AS id,link.titel AS titel,link.url AS url,link.positie AS positie,link.linkcategorieid AS linkcategorieid,linkcategorie.positie FROM link,linkcategorie WHERE link.linkcategorieid='0' OR link.linkcategorieid=linkcategorie.id GROUP BY link.linkcategorieid,link.positie,link.id ORDER BY linkcategorie.positie,link.linkcategorieid


Deze query zorgt wel voor een redelijk lijstje, maar de links met categorieid=0 staan ergens in het midden en deze wil ik graag bovenaan hebben.

[ Voor 9% gewijzigd door RSD op 09-01-2006 12:50 ]


Acties:
  • 0 Henk 'm!

  • DirkT
  • Registratie: Juli 2002
  • Niet online

DirkT

toet

Als ik het zo even snel lees heb je dus je ORDER BY verkeerd om staan? als je wil dat die tenminste bovenaan komt zal die sowieso prioriteit moeten krijgen en een ASC erachter is wel zo netjes

iRacing profiel - FanaLEDs voor je racesimulatie displays en meer!


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Als ik die omdraai heb ik weer het lijstje zonder dat hij naar de positie van de categorie kijkt.

Acties:
  • 0 Henk 'm!

  • DirkT
  • Registratie: Juli 2002
  • Niet online

DirkT

toet

ik weet niet of dit dan mogelijk is in 1 query, je zou het wel kunnen doen met 2 queries waarbij je de eerste met een whileloop de tweede laat doen. Zo heb ik het voor een forum ook een keer opgelost omdat het me niet anders lukte

iRacing profiel - FanaLEDs voor je racesimulatie displays en meer!


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Maar dan krijg je bij elke categorie die je hebt een extra query. Het liefst heb ik het in 1 query. Tenzij meerdere queries niet zo veel scheelt in performance natuurlijk. Maar volgens mij is dat wel zwaarder. De query is bedoeld voor een site die aardig wat verkeer trekt.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Heb ook al geprobeerd om het op te splitsen, maar dan wordt het ook een grote chaos. Dus de categorieen in arrays zetten ed. Het mooiste zou zijn als ik 1 query heb die het voor me doet.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SQL:
1
2
...
ORDER BY link.categorieid = 0, linkcategorie.positie, link.linkcategorieid

Werkt dat niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op maandag 09 januari 2006 @ 14:21:
SQL:
1
2
...
ORDER BY link.categorieid = 0, linkcategorie.positie, link.linkcategorieid

Werkt dat niet?
Dat gaat inderdaad werken denk ik, enkel moet je er ORDER BY link.categorieid = 0 DESC van maken als je eerst die zonder categorie id wil (true > false)

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Hmm, ik had het net opgelost door een aparte query te doen voor categorieid=0. Maar 1 query is mooier natuurlijk. Dus ga ik dit straks nog even proberen.

Acties:
  • 0 Henk 'm!

  • DirkT
  • Registratie: Juli 2002
  • Niet online

DirkT

toet

grote choas? je moet wel _veel_ traffic hebben wil je echt last hebben van z'n loop

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function get_all() {
 $result = array();

 $sql = "SELECT catagorie_id FROM catagorieen";
 $query = mysql_query($sql);

 while ($array = mysql_fetch_array($query)) {
   $sql_link = "SELECT links.url, links.pos, links.cat_id FROM links WHERE links.cat_id = ".$array['catagorie_id']." ORDER BY links.pos ASC";
   $query_link = mysql_query($sql_link);
   $result[] = mysql_fetch_array($query_link);
 }

return $result;
}


zoiets maar dan anders ;)

iRacing profiel - FanaLEDs voor je racesimulatie displays en meer!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

@bosmeeuw: inderdaad, slordig van me. :)

@SantjeS: dat het weinig resources kost wil natuurlijk nog niet zeggen dat het met een enkele query niet fijner zou zijn. ;) Dat is meteen ook een stuk leesbaarder.

@RSD: waarom heb je eigenlijk al die AS'en in je query staan? link.id AS id is vrij overbodig, omdat het al als "id" in je resultset komt te staan. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DirkT
  • Registratie: Juli 2002
  • Niet online

DirkT

toet

-NMe- schreef op maandag 09 januari 2006 @ 14:37:
...
@SantjeS: dat het weinig resources kost wil natuurlijk nog niet zeggen dat het met een enkele query niet fijner zou zijn. ;) Dat is meteen ook een stuk leesbaarder.
...
Tuurlijk in 1 query is altijd fijner dan in meer. dat het niet leesbaar wordt vind ik dan wel weer meevallen maar ik heb het vaak op deze manier "volgens mij dan" echt nodig, ik zal even een voorbeeldje proberen op te duikelen want die query heb ik toen ook aan iemand gevraagd die al langer met SQL bezig was dan ikzelf en die zei ook dat het niet anders kon toen.

edit:
voorbeeldje:

Tabel hoofdforums:
hid
htitle

Tabel subforums:
sid
stitle
hid

De enige koppeling is dus, hoe logisch, het "hid"

Nu wil ik zodanig een query uitvoeren dat ik dus alles terug krijg in een result dat ik bovenaan als eerste rij terugkrijg het eerste hoofdforum, volgende rij moet z'n eerste subforum zijn. daarna tweede etc. Daarna moet het tweede hoofdforum komen etc. etc...

Nu doe ik dus op soortgelijke manier als ik hierboven al heb voorgedaan, kan het anders want daar ben ik zeer benieuwd naar :)

[ Voor 30% gewijzigd door DirkT op 09-01-2006 14:52 ]

iRacing profiel - FanaLEDs voor je racesimulatie displays en meer!


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
@NME

Ik dacht dat dat noodzakelijk was, omdat als je in tabel link en in tabel linkcategorie allemaal een id hebt, dan weet hij niet welke die moet pakken.. of is dat niet zo?

Dus bijv:

SELECT link.id,linkcategorie.id FROM etc..

Dan heb je toch 2 velden met id?

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Aliassen zijn wel handig als je meerdere tabellen hebt om dezelfde veldnamen. Dit komt met name doordat verschillende client-libs deze anders interpreteren en je dus verwijzingen kan gaan krijgen naar velden die ontbreken. (zo heb ik het ervaren iig.)

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Werkt perfect! Bedankt!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Aliassen zijn inderdaad handig wanneer je in een query meerdere velden hebt met dezelfde naam in verschillende tabellen, maar dat is bij deze query niet het geval en dus maakt het de query alleen maar logger zonder dat het feitelijk iets doet. Als je nu inderdaad twee keer een id-veld selecteert, dan zou je een van die twee inderdaad kunnen aliassen, maar dat is hier niet het geval. :)

Wàt werkt er perfect trouwens? Welke oplossing heb je geprobeerd? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

-NMe- schreef op maandag 09 januari 2006 @ 17:09:
Aliassen zijn inderdaad handig wanneer je in een query meerdere velden hebt met dezelfde naam in verschillende tabellen, maar dat is bij deze query niet het geval en dus maakt het de query alleen maar logger zonder dat het feitelijk iets doet. Als je nu inderdaad twee keer een id-veld selecteert, dan zou je een van die twee inderdaad kunnen aliassen, maar dat is hier niet het geval. :)
Toch heb ik wel een aantal situaties gehad waarbij het wenselijk is om een alias te gebruiken. Bijvoorbeeld omdat de veldnaam in kwestie daarna rechtstreeks kan worden overgenomen door een template-/document-engine zonder dat je daar nog een conversielaag tussen hoeft te zetten. Wellicht dat je ervaring hebt met Proteus? Daar kan je rapporten in maken en is het erg vervelend als je plotseling een veld 'id' tegen komt. Id wat? Productid, orderid? Maar voor queries die binnen een applicatie worden uitgevoerd speelt het niet zo snel.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!

Pagina: 1