Avatar billede haolan Nybegynder
04. juli 2005 - 00:08 Der er 11 kommentarer og
2 løsninger

Links i flere kategorier

Det er meningen at i min linksystem skal man kunne have et link der vises i flere kategorier, jeg har prøvet med følgende, men det virker ikke rigtigt..

$r = mysql_query("SELECT * FROM links WHERE kategori, kategori2, kategori3 = '$kategori' order by id DESC LIMIT $offset,$pr_side");
$w = mysql_query("SELECT * FROM links WHERE kategori, kategori2, kategori3 = '$kategori' order by overskrift ASC LIMIT $offset,$pr_side");
$antal = mysql_query("select COUNT(*) AS total from links where kategori = '$kategori'");

Hvordan kan man ellers gøre?
Avatar billede haolan Nybegynder
04. juli 2005 - 00:14 #1
oprindeligt ser det jo sådan ud:

$r = mysql_query("SELECT * FROM links WHERE kategori = '$kategori' order by id DESC LIMIT $offset,$pr_side");
$w = mysql_query("SELECT * FROM links WHERE kategori= '$kategori' order by overskrift ASC LIMIT $offset,$pr_side");
$antal = mysql_query("select COUNT(*) AS total from links where kategori = '$kategori'");
Avatar billede jaw Nybegynder
04. juli 2005 - 01:02 #2
Hvis jeg forstår dit spørgsmål korrekt, ville jeg prøve:

$r = mysql_query("SELECT * FROM links WHERE kategori = '$kategori' OR kategori2 = '$kategori' OR kategori3 = '$kategori' ORDER BY id DESC LIMIT $offset, $pr_side");
Avatar billede mrgumble Nybegynder
04. juli 2005 - 01:08 #3
Okay, det her hører godt nok til under MySQL, men vi kan da godt skrive.
Det du har, er en masse-til-masse relation, så du har brug for 3 tabeller:
kategorier, links, join
De indeholder som minimum felterne:
'kategorier': kategori_id og kategori (liste over kategorierne)
'links': link_id, link (liste over links)
'join': kategori_id, link_id (tabellen der binder kategorierne og linksene sammen)

Felterne i 'join' er referencer til de rigtige felter, og indeholder derfor kun det unikke nummer.

For at hente alle linksene som hører under en bestemt kategori_id, skal du bruge en join:
SELECT links.link, links.link_id
FROM (kategori INNER JOIN [join] ON kategori.kategori_id = join.kategori_id) INNER JOIN links ON join.link_id = links.link_id
WHERE (((join.kategori_id)=3))
ORDER BY links.link;

SQL-sætningen er godt nok taget fra Access, så den skal muligvis tilpasses lidt. Men det er bare for at give den overordnede idé om, hvordan den skal ordnes.
Tilsvarende for at hente antallet, er den meget let:
SELECT count(*) as total FROM 'join' WHERE kategori_id = 5;
Avatar billede haolan Nybegynder
04. juli 2005 - 11:53 #4
altså formålet er at hvis en bruger fx har et link der relatere sig til kategorien computerspil men samtidig onlineshopping og underholdning, så skal linket kunne blive vist i alle 3 kategorier og hver kategori har hvert sit ID nummer, derfor når en bruger tilføjer et link der passer ind i 3 kategorier så får databasen 3 kategori ID numre.. Derfor er der både kategori, kategori2 og kategori3..

Ok??
Avatar billede jaw Nybegynder
04. juli 2005 - 11:55 #5
Ja, det er en måde at gøre det på, og så tror jeg mit forslag vil virke... Dog er mrgumble's forslag nok mere prof, dog også lidt mere avanceret.
Avatar billede haolan Nybegynder
04. juli 2005 - 11:59 #6
Jeg har nu prøvet med:

$r = mysql_query("SELECT * FROM links WHERE kategori AND kategori2 AND kategori3 = '$kategori' order by id DESC LIMIT $offset,$pr_side");
$w = mysql_query("SELECT * FROM links WHERE kategori AND kategori2 AND kategori3 = '$kategori' order by overskrift ASC LIMIT $offset,$pr_side");

Og så har jeg lagt et link ind med kategori 1,2 og 3..

I kategori 1 skriver den bare antallet af links uden at vise dem, i kategori 2 skriver den ingenting og i kategori 3 udskriver den linket, men skriver at der er 0 links :S
Avatar billede mrgumble Nybegynder
04. juli 2005 - 12:04 #7
Mit forslag tager højde for, at hver link kan have n antal kategorier.
Men for at svare dit oprindelige spørgsmål, så kan jeg se problemet. Din oprindelige SQL:
"SELECT * FROM links WHERE kategori, kategori2, kategori3 = '$kategori' ORDER BY (...)"
Det er din WHERE-stykke der giver problemer. Desværre er MySQL ikke smart nok til at genkende hvad du vil, så du bliver nødt til at skære det ud i pap.
Syntaxen for WHERE er: felt = værdi[ AND/OR felt2 = værdi2[ AND/OR felt3 = værdi3[ AND/OR ...]]]]
Hvis vi indsætter dine værdier, ser det således ud:
WHERE kategori1, kategori2, kategori3 = værdi.
Du mangler altså at redegøre for kategori1 og kategori2, og sammenhængen derimellem.

Løsning:
WHERE kategori1 = '$kategori' OR kategori2 = '$kategori' OR kategori3 = '$kategori'
Avatar billede haolan Nybegynder
04. juli 2005 - 12:08 #8
Jeg har nu prøvet med din løsning.. nu viser den linket i kategori 1 og kategori 2, men ikke kategori 3..
Avatar billede haolan Nybegynder
04. juli 2005 - 12:09 #9
ahr.. der mangler bare en $ :)
Avatar billede haolan Nybegynder
04. juli 2005 - 12:10 #10
nææ, hov.. jeg så ikke ordentligt efter.. ja så ved jeg ikke hvor fejlen er..
Avatar billede haolan Nybegynder
04. juli 2005 - 12:12 #11
Jeg fandt selv fejlen.. jeg havde glemt at fjerne det gamle stykke med = '$kategori' ;)

Tak for hjælpen..
Avatar billede mrgumble Nybegynder
04. juli 2005 - 12:13 #12
Så bliver jeg nødt til at bede dig om at vise din SQL-sætning her igen, og sige hvad du får ud af den.
Avatar billede jaw Nybegynder
04. juli 2005 - 13:35 #13
Hmmm, nu er det sommer og dejligt vejr, så sur gider jeg absolut ikke være... Men er det accepterede svar ikke præcis det samme, som mit første forslag??? :)
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