DISTINCT
Beste forum leden,
ik zit een beetje te knoeien met hoe ik bepaalde gegevens uit de MySQL database ga halen.
Voorbeeld database:
De query:
Wat ik nu wil is dat de items met id 1 en 3 geselecteerd worden, omdat product met product_id 1 als 2 allebei Algemeen en Processor als cat en name hebben.
Het gaat om een database met zo'n 80.000 items en veel verschillende cat's, name's en value's.
Wie o wie?
Alvast bedankt!
ik zit een beetje te knoeien met hoe ik bepaalde gegevens uit de MySQL database ga halen.
Voorbeeld database:
Code (php)
1
2
3
4
5
2
3
4
5
id, product_id, cat, name, value
--------------------------------
1,1,Algemeen,Processor,2 Ghz
2,1,Algemeen,Geheugen,4GB
3,2,Algemeen,Processor,3 Ghz
--------------------------------
1,1,Algemeen,Processor,2 Ghz
2,1,Algemeen,Geheugen,4GB
3,2,Algemeen,Processor,3 Ghz
De query:
Code (php)
1
2
3
4
2
3
4
SELECT DISTINCT cat, name, value
FROM producten_specs
WHERE product_id IN (1,2)
ORDER BY cat,name,ABS(value) ASC
FROM producten_specs
WHERE product_id IN (1,2)
ORDER BY cat,name,ABS(value) ASC
Wat ik nu wil is dat de items met id 1 en 3 geselecteerd worden, omdat product met product_id 1 als 2 allebei Algemeen en Processor als cat en name hebben.
Het gaat om een database met zo'n 80.000 items en veel verschillende cat's, name's en value's.
Wie o wie?
Alvast bedankt!
Gewijzigd op 15/02/2011 19:55:10 door Roy D
Gesponsorde koppelingen:
SELECT id, product_id, name, value FROM tabel WHERE cat = 'Processor'
Helaas gaat het om een groot aantal gegevens waar o.a. cat kan variƫren.
Zit te denken hoe ik het duidelijker uit kan leggen, zou het niet weten? Denk dat het aardig begrijpelijk is?
Van waar de titel DISTINCT? Eigenlijk het tegenovergestelde daarvan moet er gebeuren..
==================================================
Betere uitleg:
Database:
ID's welke geselecteerd moeten worden:
1,2,3,4,7,8
Omdat de cat, algemeen en name, processor bij alle producten aanwezig zijn. ID 5,6 zijn alleen bij product 3 aanwezig, deze hoeven dus niet geselecteerd te worden.
Dus, de items (cat en name) die bij alle producten (product_id) voorkomen moeten geselecteerd worden.
Met welke query krijg ik dit voor elkaar?
Zit te denken hoe ik het duidelijker uit kan leggen, zou het niet weten? Denk dat het aardig begrijpelijk is?
Van waar de titel DISTINCT? Eigenlijk het tegenovergestelde daarvan moet er gebeuren..
==================================================
Betere uitleg:
Database:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
id, product_id, cat, name, value
--------------------------------
1,1,Algemeen,Processor,2 Ghz
2,1,Algemeen,Geheugen,4 GB
3,2,Algemeen,Processor,3 Ghz
4,2,Algemeen,Geheugen,4 GB
5,3,Beeldscherm,Inch,22"
6,3,Beeldscherm,Kleur,Zwart
7,3,Algemeen,Geheugen,3 GB
8,3,Algemeen,Processor,3 Ghz
--------------------------------
1,1,Algemeen,Processor,2 Ghz
2,1,Algemeen,Geheugen,4 GB
3,2,Algemeen,Processor,3 Ghz
4,2,Algemeen,Geheugen,4 GB
5,3,Beeldscherm,Inch,22"
6,3,Beeldscherm,Kleur,Zwart
7,3,Algemeen,Geheugen,3 GB
8,3,Algemeen,Processor,3 Ghz
ID's welke geselecteerd moeten worden:
1,2,3,4,7,8
Omdat de cat, algemeen en name, processor bij alle producten aanwezig zijn. ID 5,6 zijn alleen bij product 3 aanwezig, deze hoeven dus niet geselecteerd te worden.
Dus, de items (cat en name) die bij alle producten (product_id) voorkomen moeten geselecteerd worden.
Met welke query krijg ik dit voor elkaar?
Gewijzigd op 17/02/2011 16:12:11 door Roy D
Ben elders wat in de juiste richting geholpen met de volgende query:
Maar...
Ik gebruik nu deze query voor alle items:
Hoe voeg ik deze samen?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
select t.id, t.product_id, t.cat, t.name, t.value
from (
select cat, name
from producten_specs
group by cat, name
having count(product_id) = count(distinct product_id)
) p
join producten_specs t on t.cat = p.cat and t.name = p.name
from (
select cat, name
from producten_specs
group by cat, name
having count(product_id) = count(distinct product_id)
) p
join producten_specs t on t.cat = p.cat and t.name = p.name
Maar...
Ik gebruik nu deze query voor alle items:
Code (php)
1
2
3
4
2
3
4
SELECT DISTINCT cat, name, value
FROM producten_specs
WHERE product_id IN (1,2,3)
ORDER BY cat,name,ABS(value) ASC
FROM producten_specs
WHERE product_id IN (1,2,3)
ORDER BY cat,name,ABS(value) ASC
Hoe voeg ik deze samen?
Intussen is de oplossing gevonden:
Bedankt voor het meedenken!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$query = mysql_query("
select distinct p.cat, p.name, p.value
from producten_specs p
inner join (
select cat, `name`, count(*) as cnt
from producten_specs
where product_id in (".mysql_real_escape_string($product_ids).")
group by cat, `name`
having cnt = ".mysql_real_escape_string($product_ids_aantal)."
) c on p.cat = c.cat and p.`name` = c.`name`
where p.product_id in (".mysql_real_escape_string($product_ids).")
ORDER BY cat,name,ABS(value) ASC
");
?>
$query = mysql_query("
select distinct p.cat, p.name, p.value
from producten_specs p
inner join (
select cat, `name`, count(*) as cnt
from producten_specs
where product_id in (".mysql_real_escape_string($product_ids).")
group by cat, `name`
having cnt = ".mysql_real_escape_string($product_ids_aantal)."
) c on p.cat = c.cat and p.`name` = c.`name`
where p.product_id in (".mysql_real_escape_string($product_ids).")
ORDER BY cat,name,ABS(value) ASC
");
?>
Bedankt voor het meedenken!
Gewijzigd op 01/03/2011 21:30:07 door Roy D
roy, indien het om een groot aantal records gaat zou ik er aan denken je database te normaliseren (NV3), zo kan je de kolom "cat" apart zetten,...



