Avatar billede decrypto Nybegynder
10. december 2003 - 20:55 Der er 20 kommentarer og
1 løsning

Problemer med joins

Jeg har mange problemer med joins i mysql. Jeg tror jeg mangler paranteser.

Jeg har vha SQL server lavet nogle queries der ikke virker i MySQL. De virker fint i Access og SQL Server.

Hvad %¤"%¤ er der galt

Her er min query:
-------------------------------------------
SELECT EVENTSHOW.IDNR, EVENTSHOW.BASE_PRICE, SHOWTIME.SHOWTIME_PRICE, CATEGORY.PRICE, ROW.NAME, CLASS.CLASS_PRICE

FROM (SHOWTIME INNER JOIN (CATEGORY INNER JOIN (THEATER INNER JOIN EVENTSHOW ON THEATER.IDNR = EVENTSHOW.THEATER_ID) ON CATEGORY.IDNR = EVENTSHOW.CATEGORY_ID) ON SHOWTIME.IDNR = EVENTSHOW.SHOWTIME_ID) INNER JOIN (CLASS INNER JOIN ROW ON CLASS.IDNR = ROW.CLASS_ID) ON THEATER.IDNR = ROW.THEATER_ID

WHERE (((EVENTSHOW.IDNR)=1));
Avatar billede arne_v Ekspert
10. december 2003 - 21:03 #1
Omorganiser dine INNER JOIN's så de starter fra venstre mod højre.

((A INNER JOIN B ON ...) INNER JOIN C ON ...) INNER JOIN D ON ...
Avatar billede decrypto Nybegynder
10. december 2003 - 21:05 #2
OK jeg prøver.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:07 #3
Skal jeg starte bagfra?
Avatar billede decrypto Nybegynder
10. december 2003 - 21:08 #4
Hmm jeg har problemer.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:10 #5
SELECT eventshow.IDNR AS EVENSHOW_ID, eventshow.BASE_PRICE, showtime.SHOWTIME_PRICE, CATEGORY.PRICE,ROW.NAME,CLASS.CLASS_PRICE

FROM (((showtime INNER JOIN category) INNER JOIN theater INNER JOIN eventshow ON theater.IDNR=eventshow.THEATER_ID ON category.IDNR=eventshow.CATEGORY_ID) ON
showtime.IDNR=eventshow.SHOWTIME_ID) INNER JOIN class INNER JOIN row ON class.IDNR=row.CLASS_ID ON theater.IDNR=row.THEATER_ID
WHERE eventshow.IDNR=1;

Har jeg fået den til men den ser forkert ud.
Avatar billede arne_v Ekspert
10. december 2003 - 21:10 #6
Det gode ved INNER JOIN's er at rækkefølgen er ligegyldig !
Avatar billede arne_v Ekspert
10. december 2003 - 21:11 #7
ON'erne er forkerte
Avatar billede decrypto Nybegynder
10. december 2003 - 21:13 #8
Aaarrh jeg har ikke nok sql viden kan jeg mærke. Jeg er vant til at lave dem pr. automatic på SQL serveren. Arrrhg hvor jeg ærger mig.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:13 #9
Vil det være ok, hvis du lige gav dit bud. Så må jeg kigge på det med stærke briller for at fostå logikken.
Avatar billede arne_v Ekspert
10. december 2003 - 21:14 #10
Jeg går igang.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:17 #11
Jeg har også en right outer join der giver mig problemos.


-------------------- SQL ---------------------

SELECT    theater.IDNR AS THEATER_ID, theater.NAME AS THEATER_NAME, row.NAME AS ROW_NAME, seat.SEATNUMBER,
                      status.IDNR AS STATUS_ID

FROM        status INNER JOIN
                      seat_reservation ON status.IDNR = seat_reservation.STATUS_ID RIGHT OUTER JOIN
                      theater INNER JOIN
                      row INNER JOIN
                      seat ON row.IDNR = seat.ROW_ID ON theater.IDNR = row.THEATER_ID INNER JOIN
                      eventshow ON THEATER.IDNR = eventshow.THEATER_ID ON seat_reservation.SHOW_ID = eventshow.IDNR AND
                      seat_reservation.SEAT_ID = seat.IDNR

WHERE    (eventshow.IDNR = 1) AND (row.THEATER_ID = 1)

ORDER BY row.NAME, seat.SEATNUMBER DESC
--------------------------------------------------------------

Er det også bare samme fremgangsmåde?
Avatar billede arne_v Ekspert
10. december 2003 - 21:18 #12
Prøv med:

((((THEATER INNER JOIN EVENTSHOW ON THEATER.IDNR = EVENTSHOW.THEATER_ID)
INNER JOIN CATEGORY CATEGORY.IDNR = EVENTSHOW.CATEGORY_ID)
INNER JOIN SHOWTIME ON SHOWTIME.IDNR = EVENTSHOW.SHOWTIME_ID)
INNER JOIN ROW ON THEATER.IDNR = ROW.THEATER_ID)
INNER JOIN CLASS ON CLASS.IDNR = ROW.CLASS_ID
Avatar billede arne_v Ekspert
10. december 2003 - 21:18 #13
Det vil jeg tro.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:26 #14
Jeg får fejl
Avatar billede decrypto Nybegynder
10. december 2003 - 21:26 #15
SELECT eventshow.IDNR AS EVENSHOW_ID, eventshow.BASE_PRICE, showtime.SHOWTIME_PRICE, CATEGORY.PRICE, ROW.NAME, CLASS.CLASS_PRICE

FROM (showtime INNER JOIN (category INNER JOIN (theater INNER JOIN eventshow ON theater.IDNR=eventshow.THEATER_ID) ON category.IDNR=eventshow.CATEGORY_ID) ON showtime.IDNR=eventshow.SHOWTIME_ID) INNER JOIN (class INNER JOIN row ON class.IDNR=row.CLASS_ID) ON theater.IDNR=row.THEATER_ID

WHERE eventshow.IDNR=1;

Det var vel denne query du fik ik?
Avatar billede arne_v Ekspert
10. december 2003 - 21:31 #16
Har du overvejet den gode gamle måde ?

SELECT EVENTSHOW.IDNR, EVENTSHOW.BASE_PRICE, SHOWTIME.SHOWTIME_PRICE, CATEGORY.PRICE, ROW.NAME, CLASS.CLASS_PRICE
FROM SHOWTIME,CATEGORY,THEATER,EVENTSHOW,CLASS,ROW
WHERE THEATER.IDNR = EVENTSHOW.THEATER_ID AND
      CATEGORY.IDNR = EVENTSHOW.CATEGORY_ID AND
      SHOWTIME.IDNR = EVENTSHOW.SHOWTIME_ID AND
      CLASS.IDNR = ROW.CLASS_ID AND
      THEATER.IDNR = ROW.THEATER_ID AND
      EVENTSHOW.IDNR=1
Avatar billede decrypto Nybegynder
10. december 2003 - 21:32 #17
Den gode gamle måde virker fint.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:33 #18
Hvad er fordelen med inner joins, hvis man kan ovenstående???
Avatar billede decrypto Nybegynder
10. december 2003 - 21:33 #19
Performance?
Avatar billede arne_v Ekspert
10. december 2003 - 21:35 #20
Formentligt.

Plus at syntaxen passer bedre til LEFT JOIN syntaxen.
Avatar billede decrypto Nybegynder
10. december 2003 - 21:38 #21
Mange 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
Computerworld tilbyder specialiserede kurser i database-management

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