[mysql] soort 'sub'-WHERE in velden die je SELECT

Pagina: 1
Acties:

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik vraag me af of het volgende mogelijk is:

code:
1
2
3
4
5
 // pseudo code
SELECT (field1 WHERE field1 >= 1 && field1 <= 10) AS field1_1,
(field1 WHERE field1 >= 11 && field1 <= 20) AS field1_2,
(field1 WHERE field1 >= 21 && field1 <= 30) AS field1_3
FROM table WHERE field2 = 'kan_dit'


Oftwel in het nederlands:
Delen uit een veld selecteren en die een aparte naam geven.
Dit kan bijvoorbeeld nuttig zijn als je met 1 query een overzicht wil maken van leeftijden, maar dan per 3 categorieen die je zelf definieert
Het kan natuurlijk ook met 3 queries...maar het leek me handiger dit met 1 te doen. Als het kan tenminste??

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Volgens mij kan dit niet in MySQL.
In Oracle doe je dit met een decode.

Who is John Galt?


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

code:
1
select (age <10) as cat1, ((age >=10) and (age<20)) as cat2
...zou moeten werken, heb net iets vergelijkbaars geprobeerd en dat gaat goed. Komt een boolean uit de compare, en die komt netjes per record in de resultset te staan.

In feite is dit stukje niet anders dan wat jij schreef, dus het antwoord is "ja_dit_kan" :) Gegeven dat je jouw code gewoon in een mysqld had kunnen dunken, mijn wedervraag: wat zou het probleem moeten zijn?

[ Voor 4% gewijzigd door Rataplan op 22-11-2002 17:41 . Reden: haakje |:( ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik zie nu dat m'n voorbeeld niet helemaal slim gekozen is, omdat ik field1 zelf selecteer
Eigenlijk zou het voorbeeld zo moeten zijn:

// pseudo code
SELECT (naam WHERE age >= 1 && age <= 10) AS naam_1,
(naam WHERE age >= 11 && age <= 20) AS naam_2,
(naam WHERE age >= 21 && age <= 30) AS naam_3
FROM table WHERE plaats = 'amsterdam'

De bedoeling is dan dat ik 3 kolommen terugkrijg van mensen in amsterdam in die 3 leeftijdsgroepen. Da's handig als je bijvoorbeeld met php een overzichtje wil maken. Dan hoef je niet 3 keer een query op je database los te laten. Nou valt 3 keer nog wel mee, maar ik wil het voor iets gebruiken waarbij ik 3x10 kolommen wil doen. Zou handig zijn als ik dat tot slechts 3 queries kon terugbrengen ipv de 30 die ik nu nodig heb (die genereer ik dan uiteraard wel dynamisch..maar toch)

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

marty schreef op 24 November 2002 @ 01:43:
De bedoeling is dan dat ik 3 kolommen terugkrijg van mensen in amsterdam in die 3 leeftijdsgroepen.
Ik moest er eeeeeeeven over nadenken, maar volgens mij is dit in elke vorm van SQL onmogelijk.


Journalism is printing what someone else does not want printed; everything else is public relations.


  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

volgens mij valt dat idd buiten de SQL standaard... en is ook niet erg, je maakt ff 3 queries en toont deze...

Cogito Ergo Credo


  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 31-01 20:37
Het val wel degelijk binnen de SQl standaard, maar buiten de MySQL standaard. je heb zojuist een van de zwakke plekken van MySQL gevonden (samen met het ontbreken van de referentiele integriteit zijn het de grootste nadelen van MySQL)

Het zijn gewoon sub-query's. Access Heeft er geen problemen mee

Alleen in jou specefieke geval gaat het idd niet werken. Maakt niet uit.. Maak je gewoon 3 aparte query's.. Suc6!

  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 30-07 19:19
marty schreef op 24 november 2002 @ 01:43:
Ik zie nu dat m'n voorbeeld niet helemaal slim gekozen is, omdat ik field1 zelf selecteer
Eigenlijk zou het voorbeeld zo moeten zijn:

// pseudo code
SELECT (naam WHERE age >= 1 && age <= 10) AS naam_1,
(naam WHERE age >= 11 && age <= 20) AS naam_2,
(naam WHERE age >= 21 && age <= 30) AS naam_3
FROM table WHERE plaats = 'amsterdam'
Hmm, dan zou 'ie NULL moeten geven voor een kolom waar en van de 3 naam colommen niet gevonden kan worden. Maar waarom geef je niet een leeftijds-cathegorie colom mee? Zoals dit :
code:
1
2
3
4
5
6
7
8
9
SELECT
    Naam,
    (IF((age >= 1 && age <= 10), 1, 0) + IF((age >= 11 && age <= 20), 2, 0) + IF((age >= 21 && age <= 30), 3, 0)) AS AgeCathegory
FROM 
    table
WHERE 
    plaats = 'amsterdam'
AND 
    age <= 30

Genoeg is meer dan veel, en tart den overvloed


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Wat je wilt is ietwat raar als je het mij vraagt. Je wilt meerdere tabel-rijen combineren tot een enkele output rij en daarbij een veld wat normaal een keer per rij voorkomt meerdere keren tonen.
Hoewel dat voor je uitvoer natuurlijk een goed idee is (voor mensen zijn kolommen overzichtelijk per leeftijdscategorie overzichtelijk) is het natuurlijk niet iets wat je vraagt aan je database lijkt me :)

Om het toch voor elkaar te krijgen zou ik (in pseudo code):
code:
1
2
3
4
5
6
7
8
9
10
11
Query: SELECT Naam, age FROM table WHERE plaats  = 'amsterdam'  ORDER BY age
kolom_index = 0
uitvoer_positie = 0
leeftijd_klassen = array("10", "20", "30") 
Voor elke rij in je query-resultaten-set {
  While (rij[age] > leeftijd_klasse[kolom_index]) {
     kolom_index++; uitvoer_positie = 0;
  }
  uitvoer[kolom_index][uitvoer_positie] = rij[naam]
  uitvoer_positie++
}

Zoiets :)

tis wel vage pseudo code geworden...

[ Voor 16% gewijzigd door CyberSnooP op 25-11-2002 15:38 . Reden: code was nog meer zooi dan nu ]

|_____vakje______|


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Nog een keer proberen: volgens mij wil de topicstarter de volgende resultset zien:
code:
1
2
3
4
5
6
7
age<10       10<=age<20          20<=age
-------------------------------------------
Jan          Teun                Cornelis
Piet         Henk                Izaak
Klaas        Willem              Zacharias
Freek                            Tobias
                                 Ezechiel

Om zonder extra code (zoals de pseudocode van CyberSnoop) dit resultaat te krijgen, kan volgens mij niet, MySQL of elke andere versie. Per regel krijg je 1 naam en 2 NULLen (of een andere leegheidsindicator).

De query uit de openingspost werkt wel, maar is volgens mij niet wat de topicstarter zoekt.

[ Voor 9% gewijzigd door Rataplan op 25-11-2002 16:13 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:34
Dit is eigenlijk dezelfdeopzet als bijvoorbeeld een linktabelletje:
1 tabel met links met daarin een veld cat die je dan uit een andere tabel haalt?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

idd, om dit in een query te doen zoals topicstarter voorstelt druist in tegen een heel aantal SQL, database- en normalisatie principes...

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Dit is ook geen retrieval functionaliteit maar rapportage/presentatie functionaliteit.
Daarom zijn er allerlei andere omgevingen (zoals PHP) om de presentatie te regelen

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Rataplan schreef op 25 november 2002 @ 16:12:
Nog een keer proberen: volgens mij wil de topicstarter de volgende resultset zien:
code:
1
2
3
4
5
6
7
age<10       10<=age<20          20<=age
-------------------------------------------
Jan          Teun                Cornelis
Piet         Henk                Izaak
Klaas        Willem              Zacharias
Freek                            Tobias
                                 Ezechiel
Klopt helemaal!
Dat is wat ik bedoel


Ik weet wel dat ik het mbv PHP kan doen, maar daar heb ik dan in mijn geval 30 aparte queries voor nodig. Ik hoopte dat het met 3 kon (ik wil namelijk 3 keer 10 categorien) - dat is toch aanmerkelijk sneller ;-)

De reden dat ik die categorien niet eerder heb aangemaakt is dat het een nogal omvangrijke database is en ik nu op een punt kom waarbij we overzichten van bepaalde dingen willen. Het zou ook niet nuttig zijn die categorien vast te leggen, want volgende week kan er wel besloten worden dat we een andere categorie indeling willen. Bovendien valt het niet te overzien op wat voor andere categorieen we nog indelingen willen maken. Maarja, daarom staat het ook juist allemaal in een database :9

Anyways, allemaal bedankt voor het meedenken

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je moet ook wel 3 queries doen gesorteerd op age, maar in de presentatie van de records, deze verdelen over de 10 categorieën.
Bijv een array of een tabel-object in PHP. Ik ken PHP niet, maar moet toch kunnen lijkt me.

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
uhhh....er staan ruim 6000 records en zo'n 20 velden in die tabel
denk dat ik sneller af ben met 10 queries dan dat ik alles in arrays kwak en daarmee ga jongleren

Verwijderd

Begrijp ik nou dat jij uit 1 tabel 3 verschillende overzichten wil maken, waarbij het verschil per overzicht de kolom waarop gecategoriseerd wordt is?

Ik dat geval zou ik Goodielover's advies volgen om, per overzicht 1 query, waarbij de te displayen gegevens op de te categoriseren kolom gesorteerd worden. Hierdoor zijn deze gegevens makkelijk op te breken in de verschillende categorieen.

Queries op de database kosten over het algemeen veel meer performance dan wat licht klooiwerk met arrays.
Pagina: 1