Avatar billede jansangill Nybegynder
07. maj 2008 - 16:09 Der er 6 kommentarer

SQL problem

hejsa..

Jeg har et stort problem med min sql. Lige nu virker den dog, men ikke korrekt.

Dette er min nuværende sql:

-------------------------------------------------------------

trin2_sql = "SELECT a.id AS vareid, a.pris, a.vejl_pris, a.typen, b.navn AS varenavn, b.url AS vareurl, d.id AS gruppeid, e.url AS gruppeurl,e.beskrivelse,e.navn AS gruppenavn,e.meta_titel,e.meta_nogleord,e.meta_beskrivelse, f.billede"
   
trin2_sql = trin2_sql & " FROM kat_vare a, kat_vare_indh b, kat_vare_placering c, kat_varegrp d, kat_varegrp_indh e, kat_billede f"
   
trin2_sql = trin2_sql & " WHERE b.vare_id=a.id AND b.sprog_id="&sprogid&" AND b.online=1 AND a.online=1 AND a.id=c.v_id AND d.id=e.grp_id AND d.butik_id=1 AND e.sprog_id="&sprogid&" AND e.online=1 AND d.id=c.g_id AND f.vare_id=a.id AND f.rakkefolge=1 AND e.grp_id="&gruppeid&""
       
trin2_sql=trin2_sql&" ORDER BY c.rakkefolge DESC"

-------------------------------------------------------

Problemet ligger i at den kun henter ting ud hvis billede og varer er der.

Det der helst skal ske er at den skal til enhver tid skrive
e.beskrivelse ud, og hvis der er varer så skal den skrive varer ud, og hvis der er et billede skal der puttet et billede på. Hvis der ikke er et billede til varen så skal der et intetbillede på.

Det jeg tror skal ske er at alt skal joines på en måde så det kan lade sig gi, men efter mange timers forsøg er det ikke lykkedes mig endnu.

Håber en kan hjælpe, og hvis i ikke forstår spørgsmålet så bare spørg løs.
Avatar billede fennec Nybegynder
07. maj 2008 - 17:15 #1
Det er fordi du ikke bruger "rigtig" join. Der kan man nemlig angive om det skal være left join. Den metode du bruge kræver nemlig at data eksistere hele vejen igennem.

FROM kat_vare a
left join kat_vare_indh b on b.vare_id=a.id
left join kat_vare_placering c on a.id=c.v_id
left join kat_varegrp d on d.id=c.g_id
left join kat_varegrp_indh e on d.id=e.grp_id
left join kat_billede f on f.vare_id=a.id

Det er lidt mere omstændigt da man skal joine i rigtig rækkefølge. Samtidig må man ikke specificere left join'ede tabeller på where klausulen uden en NULL angivelse, da de ellers vil opføre sig som en inner join.

Du skal derfor også have rette alle dine x.online=1 til:
..AND (f.rakkefolge=1 or f.rakkefolge is NULL) and (e.online=1 or e.online is NULL)

Bemærk parenteser om OR delen. De er vigtige da AND er vigtigere end OR, og selecten ellers vil blive opfattet forkert.

Kender du ikke til denne type join bliver vi nok nød til at lave et mere simpel eksempel med 2-3 tabeller, da din eksisterende SQL har mange tabeller og mange betingelser og derfor er ret kompleks.
Avatar billede jansangill Nybegynder
07. maj 2008 - 20:13 #2
Yes, var også selv ude i en masse left joins, men fik det ikke helt til at lykkedes. Jeg prøver at gå i krig igen imorgen med dit nye input, så der får du at vide om det lykkedes eller ej:Z
Avatar billede solle Nybegynder
08. maj 2008 - 10:14 #3
prøv med "OUTER JOIN"...
Avatar billede solle Nybegynder
08. maj 2008 - 11:05 #4
Prøv det her:

SELECT    MAX(RecID) AS RecID, Item, MAX([Date]) AS Date,
                          (SELECT    COUNT(DISTINCT Item)
                            FROM          Table1
                            WHERE      Item = Item) AS Amount
FROM        Table1
GROUP BY Item
Avatar billede solle Nybegynder
08. maj 2008 - 11:06 #5
hov.. forkert forum!!
Avatar billede jansangill Nybegynder
08. maj 2008 - 13:39 #6
:>solle

Fennec tak for dit input, det lykkedes mig at få den til at gå op.

Må jeg være så fræk at spørge om en ting mere?

her er sql'en
----------------------------------------------------------------------

sql_forside = sql_forside & "SELECT d.id AS vareid, d.pris, d.vejl_pris, d.typen, e.navn, e.url AS vareurl"
sql_forside = sql_forside & ", a.id AS gruppeid,b.url AS gruppeurl,f.billede"
sql_forside = sql_forside & " FROM kat_varegrp a"
sql_forside = sql_forside & " INNER JOIN kat_varegrp_indh b ON a.id=b.grp_id AND b.online=1 AND b.sprog_id="&sprogid
sql_forside = sql_forside & " INNER JOIN kat_vare_placering c ON a.id=c.g_id"
sql_forside = sql_forside & " INNER JOIN kat_vare d ON d.id=c.v_id AND d.online=1"
sql_forside = sql_forside & " INNER JOIN kat_vare_indh e ON e.vare_id=d.id AND e.online=1 AND e.sprog_id="&sprogid
sql_forside = sql_forside & " LEFT JOIN kat_billede f ON f.vare_id=d.id AND f.rakkefolge=1"

sql_forside = sql_forside & " WHERE a.butik_id="&butikid&" AND a.id="&forside_tilbud_id

sql_forside = sql_forside &" ORDER BY c.rakkefolge"

------------------------------------------------------------------------------

Dette virker som det skal med en undtagelse. Hvordan vil du foreslå at gøre således at der kun kan være en af samme slags vare(d.id) i listen?
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
Kurser inden for grundlæggende programmering

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