/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Inner Join - Unknown Column
Fra : Martin Mouritzen


Dato : 05-03-07 11:42

Hej i gruppen, jeg bruger MySQL 5.0.18 og har følgende query:

SELECT
   cms_videos_video.id AS id,
   cms_videos_video.title AS title,
   ROUND(AVG(cms_videos_ratings.rating)) AS rating
FROM
   cms_videos_video,
   cms_videos_tags2videos,
   cms_videos_tags
LEFT JOIN
   cms_videos_ratings
ON
   cms_videos_video.id = cms_videos_ratings.videoid
WHERE
   cms_videos_video.id = cms_videos_tags2videos.videoid
AND
   cms_videos_tags2videos.tagid = cms_videos_tags.id
AND
   cms_videos_tags.name NOT IN ("Filmtrailer","DVD-Trailer")
GROUP BY
   cms_videos_video.id
ORDER BY
   rating
DESC
LIMIT
   0,1

som returnerer følgende fejl: Unknown column 'cms_videos_video.id' in
'on clause'

Hvis jeg fjerner WHERE og de 2 tabeller i FROM der har med det at gøre
(cms_videos_tags2videos og cms_videos_tags) så virker det, men jeg
skal bruge WHERE til at frasortere nogen bestemte kategorier.

Hvis jeg fjerner LEFT JOIN + rating i SELECT + ORDER BY rating, så
virker det også, så problemet ser ud til at være at mit LEFT JOIN og
mit WHERE statement ikke fungerer sammen.

Jeg har siddet længe og fået grå hår over queryet, så hvis nogen kan
hjælpe er der ekstreme mængder god karma at hente.

 
 
Jens Gyldenkærne Cla~ (05-03-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 05-03-07 12:09

Martin Mouritzen skrev:

> som returnerer følgende fejl: Unknown column
> 'cms_videos_video.id' in 'on clause'

Har du prøvet at fjerne aliaset på kolonnen?

Jeg er generelt en stor tilhænger af eksplicitte joins (og
aliaser), så jeg ville skrive din forespørgsel som følger:

SELECT
   v.id,
   v.title,
   ROUND(AVG(cms_videos_ratings.rating)) AS rating
FROM
   cms_videos_video v
INNER JOIN
   cms_videos_tags2videos t2v
ON   v.id = t2v.videoid
INNER JOIN
   cms_videos_tags t
ON   t2v.tagid = t.id
LEFT JOIN
   cms_videos_ratings vr
ON   cms_videos_video.id = vr.videoid
WHERE
   t.name NOT IN ('Filmtrailer','DVD-Trailer')
GROUP BY
   v.id
ORDER BY
   rating
DESC
LIMIT
   0,1


De dobbelte anførselstegn i WHERE-klausulen (i den oprindelige
forespørgsel) ligner også en fejl - jeg ved ikke om MySQL er lige
så eftergivende som Access på det punkt, men hvis værdierne skal
læses som tekststrenge, er det kun korrekt at anvende
apostroffer/enkeltanførselstegn.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Martin Mouritzen (05-03-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 05-03-07 12:53

On Mon, 05 Mar 2007 12:08:34 +0100, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:

>Jeg er generelt en stor tilhænger af eksplicitte joins (og
>aliaser), så jeg ville skrive din forespørgsel som følger:

<snip SQL>

Efter at have rettet lidt i din kode (der var bare lige et par
henvisninger til de tabeller der ikke var alias til), så virker det
næsten. - Det eneste problem er at den ikke frasorterer de rækker som
har et tagname jeg vil frasortere på baggrund af.

Nu ser min SQL sådan her ud:

SELECT
   v.id AS id,
   v.title AS title,
   ROUND(AVG(vr.rating)) AS rating
FROM
   cms_videos_video v
INNER JOIN
   cms_videos_tags2videos t2v
ON
   v.id = t2v.videoid
INNER JOIN
   cms_videos_tags t
ON
   t2v.tagid = t.id
LEFT JOIN
   cms_videos_ratings vr
ON
   v.id = vr.videoid
WHERE
   t.name
NOT IN ('Filmtrailer','DVD-Trailer')

GROUP BY
   v.id

ORDER BY
   rating
DESC
LIMIT
   0,1


Jeg har også prøvet at ændre WHERE til

WHERE
   ( t.name != 'Filmtrailer'
AND
   t.name != 'DVD-Trailer' )

men jeg får stadig de film ud som har tags "Filmtrailer" og
"DVD-Trailer"

>De dobbelte anførselstegn i WHERE-klausulen (i den oprindelige
>forespørgsel) ligner også en fejl - jeg ved ikke om MySQL er lige
>så eftergivende som Access på det punkt, men hvis værdierne skal
>læses som tekststrenge, er det kun korrekt at anvende
>apostroffer/enkeltanførselstegn.

Det har du ret i. Desværre ser det ikke ud til at ændre noget.

Martin Mouritzen (05-03-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 05-03-07 13:57

On Mon, 05 Mar 2007 12:53:27 +0100, Martin Mouritzen
<martin@siteloom.dk> wrote:

>Efter at have rettet lidt i din kode (der var bare lige et par
>henvisninger til de tabeller der ikke var alias til), så virker det
>næsten. - Det eneste problem er at den ikke frasorterer de rækker som
>har et tagname jeg vil frasortere på baggrund af.

Måske skal jeg lige indskyde at hvis jeg fjerner LEFT JOINet (+ der
hvor jeg hiver rating ud i SELECT) så bliver de af rækkerne der har de
uønskede tags fint frasorteret.

Martin Mouritzen (05-03-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 05-03-07 13:59

On Mon, 05 Mar 2007 13:56:35 +0100, Martin Mouritzen
<martin@siteloom.dk> wrote:

>Måske skal jeg lige indskyde at hvis jeg fjerner LEFT JOINet (+ der
>hvor jeg hiver rating ud i SELECT) så bliver de af rækkerne der har de
>uønskede tags fint frasorteret.

Okay, der snakkede jeg for hurtigt, det var helt tilfældigt at de 30
rækker jeg hentede ud som test var rækker som ikke havde de tags, hvis
jeg sorterer efter noget andet som f.eks. title, så har jeg stadig
problemet. - Så LEFT JOIN'et ser ud til at virke fint, men INNER
JOINsne hvor der skal frasorteres virker ikke.

Martin Mouritzen (05-03-2007)
Kommentar
Fra : Martin Mouritzen


Dato : 05-03-07 17:19

On Mon, 05 Mar 2007 13:59:25 +0100, Martin Mouritzen
<martin@siteloom.dk> wrote:

>Okay, der snakkede jeg for hurtigt, det var helt tilfældigt at de 30
>rækker jeg hentede ud som test var rækker som ikke havde de tags, hvis
>jeg sorterer efter noget andet som f.eks. title, så har jeg stadig
>problemet. - Så LEFT JOIN'et ser ud til at virke fint, men INNER
>JOINsne hvor der skal frasorteres virker ikke.

Ikke for at sidde og holde en monolog, men jeg har fået det til at
virke ved at bruge subselect. Problemet er så bare at nu tager queriet
for lang tid til at det kan bruges. - Er der nogen der har nogen
forslag?


Query som det ser ud nu:

SELECT
   v.id AS id,
   v.title AS title,
   ROUND(AVG(vr.rating)) AS rating
FROM
   cms_videos_video v
LEFT JOIN
   cms_videos_ratings vr
ON
   v.id = vr.videoid

   WHERE
      v.id
      NOT IN
         (
            SELECT
               cms_videos_tags2videos.videoid
            FROM
               cms_videos_tags2videos,
               cms_videos_tags
            WHERE
            (
               cms_videos_tags.name =
'Filmtrailer'
            OR
               cms_videos_tags.name =
'DVD-Trailer'
            )
            AND
               cms_videos_tags.id =
cms_videos_tags2videos.tagid
            AND
               cms_videos_tags2videos.videoid
= v.id
         )
   

   GROUP BY
      v.id

ORDER BY
   rating
DESC
LIMIT
   0,30

Søg
Reklame
Statistik
Spørgsmål : 177449
Tips : 31962
Nyheder : 719565
Indlæg : 6408120
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste