Ik ben hiermee al enkele dagen aan het rommelen maar kom er niet uit.
Het zal wel simpel zijn maar ik zie het niet.

Ik wil een categorie uit de database kunnen verwijderen.
Maar als er in deze categorie artikelen zitten die niet in een andere categorie zitten mag deze niet verwijderd worden.

De tabel Categorie_per_artikel bevat;
Cpa_id
Categorie_id
Artikel_id

Ik moet dus die artikelen tellen die niet in een andere categorie zitten met COUNT().
Of nog mooier de id's ophalen. Dan kan ik die artikelen laten zien.
Ik probeer;
SELECT COUNT(*) FROM Categorie_per_artikel WHERE Categorie_id=? AND !Categorie_id=?
Maar deze telt niets en ook niet wat ik wil.
Wie helpt mij op weg?.
Dit kun je beter oplossen door je foreign key constraint goed in te stellen. Als je een FK aanbrengt op de kolom categorie_per_artikel.categorie_id die verwijst naar de kolom categorieen.id en de voorwaarde NO ACTION of RESTRICT meegeeft, zal de query mislukken als er nog artikelen gekoppeld zijn aan betreffende categorie.

Als je nu een categorie wilt verwijderen, zul je eerst alle koppelingen ongedaan moeten maken. Op dat moment kun je eenvoudig per artikel tellen aan hoeveel categorieën hij gekoppeld is. Is dat er 1, dan kan de betreffende categorie dus niet verwijderd worden...
Dank Blanche

Ik ben nog een newbie en gaan de weg lerende.
Ik heb het volgende uitgevoerd;
ALTER TABLE Categorie_per_artikel
ADD FOREIGN KEY (Categorie_id) REFERENCES Categorie(Categorie_id)

De koppelingen verwijderen kan ik nog volgen.
Maar ik wil dan laten zien waar de koppeling zit.
Anders moet je de hele lijst doorzoeken.
Bij het opbouwen van de query loop ik vast;
SELECT Artikel_id FROM Categorie_per_artikel WHERE Categorie_id=? AND... en dan?.

Peter
Als je de artikelen wilt laten zien die aan die ene categorie (die je wilt verwijderen) gekoppeld zijn, voer je toch gewoon deze query uit:

SELECT artikel_id 
FROM categorie_per_artikel 
WHERE categorie_id=?


En als je alleen de artikelen wilt tonen die niet aan andere categorieen gekoppeld zijn:

SELECT cpa.artikel_id 
FROM categorie_per_artikel AS cpa
WHERE cpa.categorie_id=?
AND (
  SELECT COUNT(categorie_id)
  FROM categorie_per_artikel
  WHERE artikel_id = cpa.artikel_id
) = 1

Je voert dus een subquery uit waarin je het aantal gekoppelde categorieën van een artikel bepaalt en controleert of dat gelijk is aan 1. Dan is het artikel alleen aan de categorie uit de eerste WHERE clausule gekoppeld.
[/code]
Deze mogelijkheid kende ik nog niet.
Zal hier eerst eens mee verder stoeien.

Bedankt
Blanche

Reageren