MySQL - DISTINCT

Status
Niet open voor verdere reacties.

royduin

Gebruiker
Lid geworden
6 mei 2006
Berichten
583
Beste forum leden,

ik zit een beetje te knoeien met hoe ik bepaalde gegevens uit de MySQL database ga halen.

Voorbeeld database:
Code:
id, product_id, cat, name, value
--------------------------------
1,1,Algemeen,Processor,2 Ghz
2,1,Algemeen,Geheugen,4GB
3,2,Algemeen,Processor,3 Ghz

Huidige query:
Code:
SELECT DISTINCT cat, name, value 
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.

Van waar de titel DISTINCT? Eigenlijk het tegenovergestelde daarvan moet er gebeuren..

Wie o wie?

Alvast bedankt!
 
Dat is een hele onhandige opzet die je daar hebt. Het is beter om categorie in een aparte tabel te steken en een koppel_id te gebruiken.

Ik snap volgensmij je vraag niet helemaal... wat wil je nou precies opvragen?
 
Ander voorbeeld met hopelijk een wat duidelijkere uitleg:

Database:
Code:
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

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?
 
Laatst bewerkt:
Je bedoelt zoiets?

[sql]
SELECT *
FROM producten_specs
WHERE cat = 'Algemeen' AND name IN ( 'Processor', 'Geheugen' )
[/sql]

EDIT: Nee volgensmij niet... hmm even nadenken hoor. Dit is best een lastige denk ik.
 
Laatst bewerkt:
Ik denk dat je hier niet zonder een procedure uit gaat komen... ik kan echt niks bedenken dat doet wat je wil :(
 
Wat je als voorbeeld gaf is het helaas niet omdat de cat en name heel verschillend zijn en er steeds nieuwe komen.

Het zal i.c.m. PHP zeker mogelijk zijn, maar lijkt me dat het met een query ook te doen is, enkel welke, hoe? Ik wacht het hier nog even af, wellicht anderen met tips of ideeën
 
Laatst bewerkt:
Ben elders wat in de juiste richting geholpen met de volgende query:
Code:
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

Maar...

Ik gebruik nu deze query voor alle items:
Code:
SELECT DISTINCT cat, name, value
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:
Code:
                <?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 
                "); 
                ?>

Bedankt voor het meedenken!
 
Ik zag hem op tweakers langskomen, eigenlijk niet zo heel moeilijke query, ik kon alleen zelf niet echt de logica uit je data halen :o (gelukkig anderen en jijzelf wel :) )
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan