Bekijk Volledige Versie : Traceren van records zonder child
Nico Schuyt
27/03/06, 09:40
Tabellen Groep, Subgroep en Artikel.
Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is optioneel
0:n.
Ik probeer records uit Groep te achterhalen zonder artikelen.
Een van de vele pogingen:
select g.naam
from groep as g, subgroep as s left outer join artikel as a on
a.subgroep_id=s.subgroep_id
where g.groep_id=s.groep_id and a.subgroep_id IS NULL
group by g.groep_id
order by g.naam
Dit werkt niet omdat een record uit Groep waar één van de records uit
Subgroep geen artikel heeft ook getoond wordt.
Het lukt me alleen door eerst in tabel Groep de records te markeren waar WEL
een artikel bij hoort en daarna te kijken bij welke dat niet zo is.
Heeft iemand een suggestie voor de SQL om ze rechtstreeks te vinden?
--
Nico Schuyt
http://www.nicoschuyt.nl/
Nico Schuyt wrote:
> Tabellen Groep, Subgroep en Artikel.
> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is
> optioneel 0:n.
> Ik probeer records uit Groep te achterhalen zonder artikelen.
[KNIP]
> Dit werkt niet omdat een record uit Groep waar één van de records
> uit Subgroep geen artikel heeft ook getoond wordt.
Even voor de zekerheid: je zoekt dus naar groepen waarvan _alle_
subgroepen nul artikelen hebben ?
--
Erik.
Nico Schuyt
27/03/06, 12:20
Erik Baas wrote:
> Nico Schuyt wrote:
>> Tabellen Groep, Subgroep en Artikel.
>> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is
>> optioneel 0:n.
>> Ik probeer records uit Groep te achterhalen zonder artikelen. [KNIP]
>> Dit werkt niet omdat een record uit Groep waar één van de records
>> uit Subgroep geen artikel heeft ook getoond wordt.
> Even voor de zekerheid: je zoekt dus naar groepen waarvan _alle_
> subgroepen nul artikelen hebben ?
Klopt :-)
--
Nico Schuyt
http://www.nicoschuyt.nl/
Nico Schuyt wrote:
> >> Tabellen Groep, Subgroep en Artikel.
> >> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is
> >> optioneel 0:n.
>
> >> Ik probeer records uit Groep te achterhalen zonder artikelen. [KNIP]
> >> Dit werkt niet omdat een record uit Groep waar één van de records
> >> uit Subgroep geen artikel heeft ook getoond wordt.
>
> > Even voor de zekerheid: je zoekt dus naar groepen waarvan _alle_
> > subgroepen nul artikelen hebben ?
> Klopt :-)
Dan kun je in elk geval de tabel Groep uit de query laten. Join Subgroep
en Artikel, en group by s.group_id (niet getest).
--
Erik.
Jan Kuiken
27/03/06, 19:00
Nico Schuyt wrote:
> Tabellen Groep, Subgroep en Artikel.
> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is optioneel
> 0:n.
optioneel voor wat?
> Ik probeer records uit Groep te achterhalen zonder artikelen.
>
> Een van de vele pogingen:
> select g.naam
> from groep as g, subgroep as s left outer join artikel as a on
> a.subgroep_id=s.subgroep_id
> where g.groep_id=s.groep_id and a.subgroep_id IS NULL
> group by g.groep_id
> order by g.naam
> Dit werkt niet omdat een record uit Groep waar één van de records uit
> Subgroep geen artikel heeft ook getoond wordt.
>
> Het lukt me alleen door eerst in tabel Groep de records te markeren waar WEL
> een artikel bij hoort en daarna te kijken bij welke dat niet zo is.
>
> Heeft iemand een suggestie voor de SQL om ze rechtstreeks te vinden?
>
Kun je de velden van de tabellen ook geven, dit maakt het analyseren
van het probleem makkelijker (wellicht zit daar het probleem)
Jan Kuiken
Nico Schuyt
27/03/06, 21:40
Erik Baas wrote:
> Nico Schuyt wrote:
>
>>>> Tabellen Groep, Subgroep en Artikel.
>>>> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is
>>>> optioneel 0:n.
>>>> Ik probeer records uit Groep te achterhalen zonder artikelen.
>>>> [KNIP] Dit werkt niet omdat een record uit Groep waar één van de
>>>> records uit Subgroep geen artikel heeft ook getoond wordt.
>>> Even voor de zekerheid: je zoekt dus naar groepen waarvan _alle_
>>> subgroepen nul artikelen hebben ?
>> Klopt :-)
> Dan kun je in elk geval de tabel Groep uit de query laten. Join
> Subgroep en Artikel, en group by s.group_id (niet getest).
Dat zal ongetwijfeld werken, maar ik wil tabel Groep er in houden omdat ik
juist van die records wil zien of er artikelen aan gekoppeld zijn. (Als dit
lukt wil ik de eventuele aanwezigheid van artikelen ook opvragen op hogere
niveaus (groepen zijn childs van Hoofdgroep bijvoorbeeld)
--
Nico Schuyt
http://www.nicoschuyt.nl/
Nico Schuyt
27/03/06, 21:40
Jan Kuiken wrote:
> Nico Schuyt wrote:
>> Tabellen Groep, Subgroep en Artikel.
>> Een Groep heeft altijd een of meer Subgroepen (1:n). Artikel is
>> optioneel 0:n.
> optioneel voor wat?
Voor Subgroep. Die kan dus een artikel als child hebben, maar het is niet
verplicht.
>> Ik probeer records uit Groep te achterhalen zonder artikelen.
>>
>> Een van de vele pogingen:
>> select g.naam
>> from groep as g, subgroep as s left outer join artikel as a on
>> a.subgroep_id=s.subgroep_id
>> where g.groep_id=s.groep_id and a.subgroep_id IS NULL
>> group by g.groep_id
>> order by g.naam
>> Dit werkt niet omdat een record uit Groep waar één van de records uit
>> Subgroep geen artikel heeft ook getoond wordt.
>> Heeft iemand een suggestie voor de SQL om ze rechtstreeks te vinden?
> Kun je de velden van de tabellen ook geven, dit maakt het analyseren
> van het probleem makkelijker (wellicht zit daar het probleem)
Hele waslijst :-)
Ik heb voor de test een extra database gemaakt met:
Groep
- groep_id
- naam
Subgroep
-subgroep_id
- groep_id
Artikel
-art_id
-subgroep_id
--
Nico Schuyt
http://www.nicoschuyt.nl/
Jan Kuiken
28/03/06, 11:40
Nico Schuyt wrote:
>>> Ik probeer records uit Groep te achterhalen zonder artikelen.
[ knip ]
> Ik heb voor de test een extra database gemaakt met:
> Groep
> - groep_id
> - naam
> Subgroep
> -subgroep_id
> - groep_id
> Artikel
> -art_id
> -subgroep_id
ik denk aan zoiets als het volgende, kon het echter niet testen
omdat de MySQL die ik gebruik versie 3.23 is subqueries vanaf
4.1 zijn.
SELECT groep.name
FROM groep
WHERE groep.id NOT
IN
(
SELECT DISTINCT groep.id
FROM artikel
LEFT JOIN subgroep ON artikel.subgroep = subgroep.id
LEFT JOIN groep ON subgroep.groep = groep.id
)
omschrijven volgens "13.2.8.11. Rewriting Subqueries as
Joins for Earlier MySQL Versions" is ook trickey
Jan Kuiken
Nico Schuyt
28/03/06, 14:20
Jan Kuiken wrote:
> Nico Schuyt wrote:
>
>>>> Ik probeer records uit Groep te achterhalen zonder artikelen.
[knip]
> ik denk aan zoiets als het volgende, kon het echter niet testen
> omdat de MySQL die ik gebruik versie 3.23 is subqueries vanaf
> 4.1 zijn.
>
> SELECT groep.name
> FROM groep
> WHERE groep.id NOT
> IN
> (
> SELECT DISTINCT groep.id
> FROM artikel
> LEFT JOIN subgroep ON artikel.subgroep = subgroep.id
> LEFT JOIN groep ON subgroep.groep = groep.id
> )
>
> omschrijven volgens "13.2.8.11. Rewriting Subqueries as
> Joins for Earlier MySQL Versions" is ook trickey
Nou, dat is in ieder geval een nieuwe invalshoek. Ga ik proberen.
Bedankt!
--
Nico Schuyt
http://www.nicoschuyt.nl/