[MYSQL] Comparen van een dataset

Pagina: 1
Acties:
  • 145 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 31-03 15:47
Ik heb een table met profiel gegevens uit deze gegevens moet ik een lijst genereren van pid (profiel id) die aan de hand van een lijst van filter data over 1 komt. Maar het probleem met mysql en zijn where's left,right,inner joins is dat de data waar je op zoekt altijd geld voor 1 row. Dus als je een lijst hebt van a en b waar de profiel lijst wel en niet aan mag voldoen hoe genereer je dan een lijst met pid waar alle a's en b's van kloppen.

De table profiel (voorbeeld)
idpidab
1118
2218
3319
4418
51210
6229
73211
8429


Ik wil als voorbeeld 2 alleen er uit krijgen dan gebruik ik
(
( a = 1 && b = 8 ) AND ( a = 1 && b != 9 )
) AND (
( a = 2 && b = 10 ) AND ( a = 2 && b != 9 ) AND ( a = 2 && b != 11 )
)

Al vast bedankt

[ Voor 16% gewijzigd door rednek op 15-02-2006 13:33 ]


Acties:
  • 0 Henk 'm!

Anoniem: 88197

hoe genereer je dan een lijst met pid waar alle a's en b's van kloppen.
Hoe weet je dat? Je hebt telkens 'rijtjes' van 4 en 3 zijn dezelfde en 1 is anders?? D.w.z. wanneer kloppen a's en b's :?

[ Voor 17% gewijzigd door Anoniem: 88197 op 15-02-2006 13:46 ]


Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 31-03 15:47
Anoniem: 88197 schreef op woensdag 15 februari 2006 @ 13:38:
[...]

Hoe weet je dat? Je hebt telkens 'rijtjes' van 4 en 3 zijn dezelfde en 1 is anders?? D.w.z. wanneer kloppen a's en b's :?
Nou als je kijkt hier naar (
( a = 1 && b = 8 ) AND ( a = 1 && b != 9 )
) AND (
( a = 2 && b = 10 ) AND ( a = 2 && b != 9 ) AND ( a = 2 && b != 11 )
)
geldt iedere ( a = 1 && b != 9 ) voor een andere row aan de hand van deze data moet ik 1 of meerdere pid's terug krijgen.

Acties:
  • 0 Henk 'm!

Anoniem: 88197

Ik zal er wel geen zak van snappen, maar die a=1 & b!=9 is overbodig IMO. Als je zoekt op a=1 && b=8, neemt ie die 1-9 helemaal niet mee :?

Leg je probleem even wat duidelijker uit anders...

[ Voor 20% gewijzigd door Anoniem: 88197 op 15-02-2006 13:55 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-06 11:51

Janoz

Moderator Devschuur®

!litemod

Maar het probleem met mysql en zijn where's left,right,inner joins is dat de data waar je op zoekt altijd geld voor 1 row
Dat is niet het probleem van mysql, maar dat is normaal voor sql.

Ik denk echter dat het hier meer te maken heeft met je booleaanse logica. De expressie die je daar post kan nooit waar zijn. Overal staan AND's terwijl je verschillende waarden zoekt. Misschien moet je hier en daar een OR plaatsen?

a kan immers niet 1 EN 2 zijn, maar wel 1 OF 2.

[ Voor 6% gewijzigd door Janoz op 15-02-2006 14:13 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 31-03 15:47
Presies en daar ligt mijn probleem, als ik ( a = 1 && b = 8 ), ( a = 1 && b != 9 ), ( a = 2 && b = 10 ), ( a = 2 && b != 9 ), ( a = 2 && b != 11 ) stuk voor stuk in verschillende query's zou gooien en de meest voorkomende pid zou returnen. Zou ik altijd 2 terug krijgen helaas is dit in geen mogelijkheid door te voeren in 1 query.

Je kan het ook omdraaien alle records die pid 2 hebben moeten allemaal voldoen aan deze items ( a = 1 && b = 8 ), ( a = 1 && b != 9 ), ( a = 2 && b = 10 ), ( a = 2 && b != 9 ), ( a = 2 && b != 11 )

[ Voor 35% gewijzigd door rednek op 15-02-2006 14:41 ]


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Klinkt mij als onlogisch in de oren....maar als je het graag wilt, kan je je booleans in je select zetten en hierover optellen. Je sorteert descending op dit veld en limiteert je uitkomst naar 1 rij.

[ Voor 3% gewijzigd door KabouterSuper op 15-02-2006 14:39 ]

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

Anoniem: 88197

Waarom niet met OR's? Group bij A, B en dan

SELECT COUNT(*), * FROM... WHERE ((a=1 AND b=8) OR (a=2 AND b=10)) GROUP BY a,b

Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Ik ben serieus benieuwd naar de performance van zo'n query eigenlijk :). Met die ORs en een beetje table van formaat kost het toch wel vrij veel tijd lijkt mij zo.

Acties:
  • 0 Henk 'm!

Anoniem: 88197

flashin schreef op woensdag 15 februari 2006 @ 15:14:
Ik ben serieus benieuwd naar de performance van zo'n query eigenlijk :). Met die ORs en een beetje table van formaat kost het toch wel vrij veel tijd lijkt mij zo.
Heb jij een beter idee? :) Wellicht kan het anders, maar zo werkt het wel (als ik de TS begrijp :X)

Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 31-03 15:47
Laat ik de boel versimpelen, het probleem is eigenlijk dit:

xyz
a11
b11
a12
b13


Het resultaat wat ik wil krijgen is alleen kolom x met de waarde "a", want die voldoet aan: y = 1 AND z = 1, én y = 1 AND z = 2. Een voorwaarde over meerdere rijen dus. Kolom x met de waarde "b" komt niet terug, want die heeft geen y = 1 AND z = 2.

Elke hulp zou welkom zijn.

Acties:
  • 0 Henk 'm!

Anoniem: 88197

SQL:
1
2
SELECT x AS xval, COUNT(*) as cnt FROM table WHERE (y=1 AND z=1) OR (y=1 OR z=2)
HAVING cnt = (SELECT COUNT(*) FROM table WHERE x = xval)

Geen idee of dit goed is :)

Komt er op neer dat het aantal waarden dat hij vindt in de hoofdquery gelijk moet zijn aan het aantal dat die waarde van x totaal voorkomt.

D.w.z. in hoofdquery 1 vindt hij nu 2x A en 1x B, maar door de HAVING laat hij B weg... Gokje B)

[ Voor 41% gewijzigd door Anoniem: 88197 op 15-02-2006 15:47 ]


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Eigenlijk moet je 2 queries doen, en het resultaat met UNION samenvoegen, met daarbij de eis dat een record in beide verzamelingen moet voorkomen. Ik heb kort zitten googlen, maar zo'n UNION is er niet.

Workaround:


code:
1
2
3
select x from tabel where y=1 and z=1 and x in (
   select x from tabel where y=1 and z=2
)

Door dieper te nesten met IN-subqueries kan je meer eisen opnemen.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Volgens mij is Boland's voorstel de beste manier.

Een INTERSECT zal ook werken (denk dat dit is wat Varienaja bedoelt) en nog veel efficienter zijn, maar helaas ondersteunt MySQL 4 dit niet :( .

When life gives you lemons, start a battery factory


Anoniem: 88197

En, Rednek, gelukt??? Zou wel leuk zijn als je de afloop ook even meldt :)

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 20-06 23:13
Nog een paar mogelijkheden, mysql kan niet overweg met veel joins, dus als je meer dan 10 ofzo voorwaarden hebt moet je de eerste mogelijkheid niet gebruiken, ik heb überhaupt geen idee of de queries bruikbaar zijn wat betreft snelheid.
SQL:
1
2
3
4
5
6
7
8
9
10
11
select a.pid
from tabel a
inner join tabel b on a.pid=b.pid
inner join tabel c on a.pid=c.pid
inner join tabel d on a.pid=d.pid
inner join tabel e on a.pid=e.pid
where a.a=1 and a.b=8
and b.a=1 and b.b!=9
and c.a=2 and c.b=10
and d.a=2 and d.b!=9
and e.a=2 and e.b!=11

SQL:
1
2
3
4
5
6
7
select a.pid
from tabel a
where pid IN (SELECT pid FROM tabel WHERE a = 1 and b=8)
and pid IN (SELECT pid FROM tabel WHERE a = 1 and b!=9)
and pid IN (SELECT pid FROM tabel WHERE a = 2 and b=10)
and pid IN (SELECT pid FROM tabel WHERE a = 2 and b!=9)
and pid IN (SELECT pid FROM tabel WHERE a = 2 and b!=11)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23-06 13:51

NMe

Quia Ego Sic Dico.

_js_ schreef op donderdag 16 februari 2006 @ 19:01:
Nog een paar mogelijkheden, mysql kan niet overweg met veel joins
Ow? Technisch niet? Of wat betreft performance niet? Want over het technisch onmogelijk zijn van veel joins in één query lees ik niks terug in de manual.

Trouwens, MySQL kan ook niet fatsoenlijk overweg met subqueries, dus grote kans dat je tweede query-opzet ook niet werkt.

'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!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 31-03 15:47
Wow dit is lang geleden. Mijn probleem was eigenlijk dat ik een tree volgens mij wilde bouwen aan de hand van een parent_id maar dan alles in 1 query. :D Die shit kan dus niet in deze structuur. wat je moet creeren om zulke structuren in 1 query uit te lezen is als volgt.

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

query:
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

result:
+----------------------+-------+
| name                 | depth |
+----------------------+-------+
| ELECTRONICS          |     0 |
| TELEVISIONS          |     1 |
| TUBE                 |     2 |
| LCD                  |     2 |
| PLASMA               |     2 |
| PORTABLE ELECTRONICS |     1 |
| MP3 PLAYERS          |     2 |
| FLASH                |     3 |
| CD PLAYERS           |     2 |
| 2 WAY RADIOS         |     2 |
+----------------------+-------+


Eindelijk na vele jaren :9

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rednek schreef op donderdag 27 mei 2010 @ 00:37:
wat je moet creeren om zulke structuren in 1 query uit te lezen is als volgt.
Dat kan (en is een goede optie) maar het kan natuurlijk ook zo.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1