12. marts 2012 - 23:30Der er
16 kommentarer og 1 løsning
Hent fra tabel og tjek værdi i anden tabel
Jeg har 3 tabeller (da et produkt kan være tilknyttet flere kategorier)
1: Kategori id kategori
2: Kategori_produkt_forbindelse id katid produktid
3: Produkt id produktnavn
Nu skal jeg have vist alle kategorier i en multiselect (ved jeg godt hvordan man gør), og de kategorier der findes i tabellen Kategori_produkt_forbindelse ud for et givent produktid skal være selected
Kan man lave det i en query, eller er man nødt til først at hente alle kategorier, og så for hver hentet kører en forspørgsel der tjekker om den er at finde?
Jeg er ikke sikker på at jeg forstår spørgsmålet. Du siger, at du har 3 tabeller. Jeg formoder det er tabeller i en database, for eksempel mysql. Vil du så skrive alle kategorier ud og for hver kategori simpelt hen vide, om der er produkter i kategorien, altså om der står noget for den kategori i tabellen Kategori_produkt_forbindelse?
Jeg lavede et par mysql testtabeller mik_k (i stedet for Kategori) og mik_kp (i stedet for Kategori_produkt_forbindelse) og puttede nedenstående værdier i. Med dette php script fik jeg så denne udskrift:
1 - k1 - ja 2 - k2 3 - k3 - ja
her er udsnit af php koden:
$result = mysql_query("SELECT k.*, COUNT(kp.katid) findes FROM mik_k k LEFT JOIN mik_kp kp ON k.id = kp.katid GROUP BY k.kategori"));
Hej Christian Så vidt jeg lige kan se har du forstået det rigtigt. Prøver det lidt senere i aften, når jeg lige har mulighed og ellers senest i morgen, og vender tilbage med det samme herefter med om det virkede Indtil videre - tak for svaret :)
Eksempel på data INSERT INTO Kategori VALUES('1', 'Kategori 1') INSERT INTO Kategori VALUES('2', 'Kategori 2') INSERT INTO Kategori VALUES('3', 'Kategori 3') INSERT INTO Produkt VALUES('1', 'Produkt 1') INSERT INTO Produkt VALUES('2', 'Produkt 2') INSERT INTO Kategori_produkt_forbindelse VALUES('1', '1', '1') INSERT INTO Kategori_produkt_forbindelse VALUES('1', '1', '2')
På siden har jeg så en variabel med et produktid, f.eks.: $produ_id = 1;
Det jeg gerne vil have vist er alle kategorier, og ud for hver kategori vide om den er i tabellen Kategori_produkt_forbindelse hvor produktidet matcher det i min variabel
Jamen så har jeg jo i #1 givet dig løsningen, bortset fra at jeg siger k1 hvor du siger Kategori 1 og jeg siger 'ja' hvor du siger 'Er i' og jeg siger ingenting hvor du siger 'Er ikke i'. Ikkesandt?
Jeg ville have troet, at du selv kunne tilpasse mit kodeforslag. (Princippet er hjælp til selvhjælp.) Samme database query bortset fra tabelnavnene, og while løkken bliver
Jo det er muligt...... Det var mere denne jeg ikke helt kunne gennemskue. Den måde man skriver ud er ikke et problem
$result = mysql_query("SELECT k.*, COUNT(kp.katid) findes FROM mik_k k LEFT JOIN mik_kp kp ON k.id = kp.katid GROUP BY k.kategori"));
Jeg kunne ikke se hvordan det produktid man allerede havde kom ind i det der. For uden produktkategori vil den jo bare finde den katid'et uanset om katidet er tilknyttet det produkt eller ej
Jeg går ud fra, at k_p_f tabellen kun har rækker hvor både produktid og katid er fyldt ud. Derfor behøber du ikke at joine med produkt tabellen for at finde ud af, om en kategori har produkter. Ik'. Ved at left joine får du også de kategorier skrevet ud hvor der ingen produkter er, men så er 'findes' = 0, som så af php koden opfattes som FALSE.
Virker det? Eller går det skævt? I så fald fortæl hvad du får.
Jeg får alle kategorier og ud for hvert kategori får jeg en der hedder findes som viser hvormange gange kategorien er fundet i kp tabellen
Men det jeg skal bruge er Alle kategorier Ud for hvert kategori skal den skrive om kategori er fundet hvor kp.produktid er lig en fast værdi f.eks. 1
Dvs. hvis vi bruger produktid 1 som eksempel Kategori 1 (findes = 1 hvis kategorien er fundet i kp hvor kp.produktid =1) Kategori 2 (findes = 1 hvis kategorien er fundet i kp hvor kp.produktid =1) Kategori 4 (findes = 1 hvis kategorien er fundet i kp hvor kp.produktid =1)
Det er godt nok svært at forklare men håber du forstår det :)
I min foreslåede mysql kode indeholder findes antallet af produkter i en kategori. Hvis du får det tal skrevet ud i din php kode, så tvivler jeg på at du følger mit forslag i #4. Jeg tror du echoer $row['findes']. Kik engang mere på hvordan jeg foreslår at gøre det i stedet, så der skrives '(Er i)' for kategorier med produkter og '(Er ikke i)' for kategorier uden produkter, sådan som du bad om i #3.
Jeg kommer til at stoppe her. Hvis mine indlæg har været til hjælp, så accepter venligst mit svar og luk spørgsmålet. Hvis jeg ikke har været til hjælp, så opret selv et svar.
Du misforstår mig. Det er ikke i koden der skriver det ud. Det er ikke noget problem at lave den eller lave simple tjek. Det er output af selve sql sætning der ikke er som det skal være.
Din ser bare om kategori idet findes i tabellen, og din kode skriver så er i eller er ikke i Men det er bare ikke nok, for det skal være for et specifikt produkt.
Dvs. findes kategori i connection tabellen, hvor produktid i connection tabellen er lig med f.eks. 1 (og ikke som din hvor du tjekker om den finde uanset produktid)
Jeg er da ked af hvis du hopper fra. For det er jo ikke fordi jeg ikke vil prøve eller fordi jeg ikke kan finde ud af din kode. Problemet er bare at det jo ikke matcher det jeg skal bruge - og det er det jeg har prøvet at skrive hele vejen hvor du troede det andet.
Jeg beklager selvfølgelig hvis jeg ikke er god nok til at forklare, men det du har skrevet er muligvis en vej derhen, men ikke en løsning, da den ikke tjekker på specifikt produktid - og jeg kan ikke lige se hvordan man skal ændre den til det, for så skal count jo kun tage hvor produktid = f.eks. 1 og ikke alle
mik2000, jeg måtte som sagt løbe. Nu kikker jeg igen - eftersom jeg ikke var sikker på, at jeg havde forstået spørgsmålet opstillede jeg i #1 den formodning, at du ville skrive alle kategorier ud og for hver kategori vise, om der var produkter i kategorien. Jeg forstod på #2, at jeg havde forstået det rigtigt, og den forståelse kørte jeg videre med. Jeg ser nu, at det ikke drejede sig om at vise om kategorier havde produkter overhovedet, men om kategorier havde produkter med id = $produ_id.
I så fald kunne du måske med fordel bruge EXISTS. Det er nogen tid siden jeg selv har været igang dermed, så jeg nørklede denne query sammen og prøvede den af med de test tabeller jeg havde lavet. Hvis du vil anvende det skal du naturligvis erstatte mine tabel og kolonne navne med dine egne.
SELECT k1.kategori AS kat1, k2.kategori AS kat2 FROM mik_k k1 LEFT JOIN (SELECT kategori FROM mik_k WHERE EXISTS (SELECT * FROM mik_kp WHERE produktid = 5 AND mik_k.id = mik_kp.katid)) k2 ON k1.kategori = k2.kategori
Jeg fik dette output (som stemmer med indholdet i tabellerne)
kat1 kat2 k1 k1 k2 NULL k3 k3
Med det mysql output kan du i php skrive kategori navnene ud fra kat1 og 'er ikke i' eller 'er i' eftersom kat2 er NULL eller ej.
Ja, jeg var også forbavset, da jeg så du tog pointene selv, skønt jeg mener jeg har gjort en vis indsats for sagen. Hvis det var en fejl, som #15 antyder, så er vejen frem at oprette et nyt spørgsmål med emnet "Point til Christian_Belgien" og med henvisning til dette spørgsmål. Hvis du opretter sådan et spørgsmål, så skal jeg lægge et svar som du så kan acceptere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.