/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MYSQL Select problem, hvordan gør man denn~
Fra : coolsti


Dato : 06-05-04 11:46

Hej,

jeg arbejder med mysql < 4.0, og jeg har et SELECT problem, som jeg ikke
kan finder ud af.

Problemet er, jeg har en tabel med søjler ID, NAME og VALUE, og jeg ville
gerne "select" alle rækker som, f.eks., har

(NAME = 'color' AND VALUE ='red') AND (NAME = 'width' AND VALUE = '50')

osv. Bemærk at jeg har et "AND"og ikke "OR" imellem grouperne.

Dvs., jeg ønsker at finde de rækker som har flere
NAME/VALUE parer.

Denne query:

SELECT * FROM tabel where (NAME = 'color' AND VALUE = 'red') AND
(NAME = 'width' AND VALUE = '50')

fungerer ikke fordi Mysql kombinerer det helle, og så ser det ud som om
NAME = 'color' AND NAME = 'width', osv., som selvfølgelige giver 0
rækker tilbage.


Er der nogen som kan hjælpe?

/Steve

 
 
///JJ (06-05-2004)
Kommentar
Fra : ///JJ


Dato : 06-05-04 13:19

coolsti wrote:
> Hej,
>
>
> (NAME = 'color' AND VALUE ='red') AND (NAME = 'width' AND VALUE =
> '50')
>
> osv. Bemærk at jeg har et "AND"og ikke "OR" imellem grouperne.

Hvorfor det? Det er der dit problem ligger :)
Du vil have at
NAME = 'color' AND VALUE ='red'
eller at
NAME = 'width' AND VALUE => '50'

Ikk?


> fungerer ikke fordi Mysql kombinerer det helle, og så ser det ud som
> om NAME = 'color' AND NAME = 'width', osv., som selvfølgelige giver 0
> rækker tilbage.

Det er jo også hvad du beder om? :)
--


Mvh
///JJ



coolsti (06-05-2004)
Kommentar
Fra : coolsti


Dato : 06-05-04 13:59

>> fungerer ikke fordi Mysql kombinerer det helle, og så ser det ud som
>> om NAME = 'color' AND NAME = 'width', osv., som selvfølgelige giver 0
>> rækker tilbage.
>
> Det er jo også hvad du beder om? :)

Hej,

jo, jeg ved godt at mening i det er svært at se i starten, men jeg ville
gerne have det med AND. I mellemtid har jeg fået et svar fra en anden
forum, og så tror jeg at problemet er løst. Her er svaret:

hvis min tabel hedder yourtable med søjler ID, NAME og VALUE, og jeg
ville finde ud af, hvilken ID'er matcher to NAME/VALUE parer, så er det
her:

select ID from yourtable
where (NAME = 'color' AND VALUE = 'red')
or (NAME = 'width' AND VALUE = '5 inches')
group by ID having count(*) = 2

I mit tilfæld ville jeg have 2 eller flere NAME/VALUE parer, men så skal
jeg bare lave den om til "... having count(*) = XXX" hvor XXX er tal på
hvor mange (NAME = 'YYY' AND VALUE = '') grouper jeg har.

/Steve


///JJ (06-05-2004)
Kommentar
Fra : ///JJ


Dato : 06-05-04 14:20

coolsti wrote:
> jo, jeg ved godt at mening i det er svært at se i starten, men jeg
> ville gerne have det med AND. I mellemtid har jeg fået et svar fra en
> anden forum, og så tror jeg at problemet er løst. Her er svaret:

> select ID from yourtable
> where (NAME = 'color' AND VALUE = 'red')
> or (NAME = 'width' AND VALUE = '5 inches')
> group by ID having count(*) = 2

Men du skulle OR'e.
Det andet med group fangede jeg ikk .

--


Mvh
///JJ



coolsti (08-05-2004)
Kommentar
Fra : coolsti


Dato : 08-05-04 09:19


> Men du skulle OR'e.
> Det andet med group fangede jeg ikk .

Problemet er, jeg har en tabel som indeholder attributer, og strukturen er

ID, NAME, VALUE

ID er ikke unique, da der kan være flere attributer for en givne ID. ID
er unique i en anden tabel, men denne tabel bruges til at holde alle
attributer for hvert ID. Men de ting, som har en ID, er forskellige,
således at de attributer, og antallet af attributerne, er ikke konstante.

Så f.eks. kan jeg have to rækker:

5, 'color', 'red'
5, 'width', '50 inches'

Opgaven er, at select alle ID's som har både (NAME = 'color' AND VALUE =
'red') AND (NAME = 'width' AND VALUE = '50 inches')

og måske flere NAME/VALUE grouper.

Det er derfor jeg har faktisk brug for den AND imellem klammerne og ikke
en OR. Men min løsning, som jeg har fundet på en anden forum, anvendes
OR, men også 1) grouperes alle rækker efter ID, og 2) giver tilbage kun
de forkellige ID's som har lige så mange rækker i select svaret, som
NAME/VALUE betingelser. Og på denne måde får jeg kun en list af ID's
som matche ALLE NAME/VALUE parer, og ikke kun nogen af dem.

/Steve

Kenneth Brun Nielsen (11-05-2004)
Kommentar
Fra : Kenneth Brun Nielsen


Dato : 11-05-04 12:20

"coolsti" <coo@goontrytospamme.com> skrev i en meddelelse
news:pan.2004.05.08.08.18.45.140000@goontrytospamme.com...
>
> > Men du skulle OR'e.
> > Det andet med group fangede jeg ikk .
>
> Problemet er, jeg har en tabel som indeholder attributer, og strukturen er
>
> ID, NAME, VALUE
>
> ID er ikke unique, da der kan være flere attributer for en givne ID. ID
> er unique i en anden tabel, men denne tabel bruges til at holde alle
> attributer for hvert ID. Men de ting, som har en ID, er forskellige,
> således at de attributer, og antallet af attributerne, er ikke konstante.
>
> Så f.eks. kan jeg have to rækker:
>
> 5, 'color', 'red'
> 5, 'width', '50 inches'
>
> Opgaven er, at select alle ID's som har både (NAME = 'color' AND VALUE =
> 'red') AND (NAME = 'width' AND VALUE = '50 inches')
>
> og måske flere NAME/VALUE grouper.
>
> Det er derfor jeg har faktisk brug for den AND imellem klammerne og ikke
> en OR. Men min løsning, som jeg har fundet på en anden forum, anvendes
> OR, men også 1) grouperes alle rækker efter ID, og 2) giver tilbage kun
> de forkellige ID's som har lige så mange rækker i select svaret, som
> NAME/VALUE betingelser. Og på denne måde får jeg kun en list af ID's
> som matche ALLE NAME/VALUE parer, og ikke kun nogen af dem.
>

OK - så tror jeg, at jeg har forstået dit problem. Nu har du tilsyneladende
fundet en brugbar løsning, men den som du efterlyste fra starten har nok
været noget i retningen af:
SELECT tabel1.ID
FROM tabel AS tabel1, tabel AS tabel2
WHERE tabel1.ID=tabel2.ID AND (tabel1.NAME = 'color' AND tabel1.VALUE
='red') AND (tabel2.NAME = 'width' AND tabel2.VALUE = '50')

(ikke afprøvet)
Jeg tror næppe ovenstående er mere "økonomisk" end den anden løsning, du har
fundet - specielt ikke hvis antallet af betingelser øges. Men det er vel den
løsningsform, som du efterlyste fra starten?

/Kenneth



Søg
Reklame
Statistik
Spørgsmål : 177472
Tips : 31964
Nyheder : 719565
Indlæg : 6408310
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste