Avatar billede Mik2000 Professor
12. marts 2012 - 23:30 Der 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?
13. marts 2012 - 07:42 #1
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"));

while($row = mysql_fetch_array($result))
{
  echo $row['id'] . " - " . $row['kategori'];
  if($row['findes'])echo " - ja";
  echo "<br>";
}

og her er tabellerne:

CREATE TABLE mik_k(id INT, kategori VARCHAR(10));
CREATE TABLE mik_kp(id INT, katid INT, produktid INT);

INSERT INTO mik_kp VALUES(1, 1, 5);
INSERT INTO mik_kp VALUES(2, 1, 6);
INSERT INTO mik_kp VALUES(3, 3, 5);
INSERT INTO mik_kp VALUES(4, 3, 6);
INSERT INTO mik_kp VALUES(5, 3, 7);
INSERT INTO mik_kp VALUES(6, 4, 5);

INSERT INTO mik_k VALUES(1, 'k1');
INSERT INTO mik_k VALUES(2, 'k2');
INSERT INTO mik_k VALUES(3, 'k3');
Avatar billede Mik2000 Professor
13. marts 2012 - 20:54 #2
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 :)
Avatar billede Mik2000 Professor
13. marts 2012 - 21:14 #3
Kiggede lige med det samme.
Kan ikke helt gennemskue om det er det jeg præcis leder efter, men tror det er noget af vejen

CREATE TABLE Kategori(k_id INT, k_kategori VARCHAR(40));
CREATE TABLE Produkt(p_id INT, p_produkt VARCHAR(40));
CREATE TABLE Kategori_produkt_forbindelse(k_p_f_id INT, k_p_f_produktid INT, k_p_f_katid INT);

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

Eksempel:
Kategori 1 (Er i)
Kategori 2 (Er i)
Kategori 3 (Er ikke i)

Jeg håber du forstår hvad jeg mener - spørg endelig, og mange tak for hjælpen :)
13. marts 2012 - 21:55 #4
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

while($row = mysql_fetch_array($result))
{
  echo $row['id'] . " - " . $row['kategori'];
  if($row['findes'])echo " (Er i) ";
  else echo " (Er ikke i)";
  echo "<br>";
}

Jeg opretter dette som svar, idet jeg mener, at jeg har besvaret dit spørgsmål.
Avatar billede Mik2000 Professor
13. marts 2012 - 22:37 #5
Hej

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
14. marts 2012 - 06:27 #6
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.
Avatar billede Mik2000 Professor
14. marts 2012 - 15:18 #7
Hej

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 :)
14. marts 2012 - 15:45 #8
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.
Avatar billede Mik2000 Professor
14. marts 2012 - 16:08 #9
Hej

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)
Avatar billede Mik2000 Professor
14. marts 2012 - 21:23 #10
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
Avatar billede Mik2000 Professor
14. marts 2012 - 21:24 #11
Men det er selvfølgelig helt i orden - i så fald må jeg lukke og i stedet lave mange forspørgsler for at få det løst, hvilket dog ikke er smart.

Men tak for din tid og dine forsøg.

Skulle du lige forstå det på et af de sidste indlæg eller er der en anden der har en løsning så skriv endelig :)
Avatar billede Mik2000 Professor
14. marts 2012 - 23:57 #12
Det lykkedes mig at få det løst ved hjælp af en kombination af select, left join, case, max og group by
15. marts 2012 - 07:37 #13
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.
15. marts 2012 - 08:16 #14
...i php koden skal 'WHERE produktid = 5' naturligvis erstattes af 'WHERE produktid = ' . $produ_id
Avatar billede Mik2000 Professor
18. marts 2012 - 14:23 #15
Hej

Mange tak :)
Det ser også ud til at virke, så vil lige teste hvilken der kører hurtigst så den kan bruges :)

Jeg vil meget gerne give point til dig for alt hjælpen. Ved du om man kan ændre det efter de er givet?
18. marts 2012 - 17:36 #16
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.
Avatar billede Mik2000 Professor
18. marts 2012 - 20:44 #17
Det var fordi jeg troede du var helt smuttet, og ikke gad spørgsmålet mere, og var jo ikke lige kommet videre med det :)

Men det er nu oprettet :)

http://www.eksperten.dk/spm/959624
Smid et svar der og så er der point

Tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester