Abfrage über 3 Tabellen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Abfrage über 3 Tabellen

      Hallo Leute,

      ich bin eigentlich recht fit in MySQL, aber hier scheitere ich:

      Gegeben sind 3 Tabellen: Ich brauche den Inhalt von Tabelle "events" komplett, in Tabelle "recurring" stehen Verweise zur ID von Tabelle "events", welche ich in Tabelle "bookings" brauche.

      Die Tabellen sehen so aus:

      Quellcode

      1. CREATE TABLE `events` (
      2. `id` int(11) NOT NULL AUTO_INCREMENT,
      3. `sid` int(11) NOT NULL DEFAULT '0',
      4. `semnum` varchar(100) NOT NULL DEFAULT '',
      5. `catid` int(11) NOT NULL DEFAULT '1',
      6. `title` varchar(500) NOT NULL DEFAULT '',
      7. `target` varchar(500) NOT NULL DEFAULT '',
      8. `shortdesc` mediumtext NOT NULL,
      9. `description` mediumtext NOT NULL,
      10. `place_id` int(11) NOT NULL DEFAULT '0',
      11. `place` mediumtext NOT NULL,
      12. `teacher` varchar(500) NOT NULL DEFAULT '',
      13. `fees` varchar(10) NOT NULL DEFAULT '0',
      14. `maxpupil` int(11) NOT NULL DEFAULT '0',
      15. `minpupil` int(6) NOT NULL DEFAULT '0',
      16. `bookedpupil` int(6) NOT NULL DEFAULT '0',
      17. `stopbooking` tinyint(1) NOT NULL DEFAULT '0',
      18. `cancelled` tinyint(1) NOT NULL DEFAULT '0',
      19. `begin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      20. `end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      21. `booked` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      22. `showbegin` tinyint(1) NOT NULL DEFAULT '1',
      23. `showend` tinyint(1) NOT NULL DEFAULT '1',
      24. `showbooked` tinyint(1) NOT NULL DEFAULT '1',
      25. `checked_out` int(11) unsigned NOT NULL DEFAULT '0',
      26. `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      27. `ordering` int(11) NOT NULL DEFAULT '0',
      28. `published` tinyint(1) NOT NULL DEFAULT '0',
      29. `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      30. `publishdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      31. `publisher` int(11) NOT NULL DEFAULT '0',
      32. `access` int(11) unsigned NOT NULL DEFAULT '1',
      33. `hits` int(11) NOT NULL DEFAULT '0',
      34. `grade` tinyint(1) NOT NULL DEFAULT '0',
      35. `certificated` int(5) NOT NULL DEFAULT '0',
      36. `paid` int(11) NOT NULL DEFAULT '0',
      37. `gmaploc` varchar(255) NOT NULL DEFAULT '',
      38. `nrbooked` int(5) NOT NULL DEFAULT '1',
      39. `pattern` varchar(255) NOT NULL DEFAULT '',
      40. `zusatz1` text NOT NULL,
      41. `zusatz2` text NOT NULL,
      42. `zusatz3` text NOT NULL,
      43. `zusatz4` text NOT NULL,
      44. `zusatz5` text NOT NULL,
      45. `zusatz6` text NOT NULL,
      46. `zusatz7` text NOT NULL,
      47. `zusatz8` text NOT NULL,
      48. `zusatz9` text NOT NULL,
      49. `zusatz10` text NOT NULL,
      50. `zusatz11` text NOT NULL,
      51. `zusatz12` text NOT NULL,
      52. `zusatz13` text NOT NULL,
      53. `zusatz14` text NOT NULL,
      54. `zusatz15` text NOT NULL,
      55. `zusatz16` text NOT NULL,
      56. `zusatz17` text NOT NULL,
      57. `zusatz18` text NOT NULL,
      58. `zusatz19` text NOT NULL,
      59. `zusatz20` text NOT NULL,
      60. `zusatz1hint` text NOT NULL,
      61. `zusatz2hint` text NOT NULL,
      62. `zusatz3hint` text NOT NULL,
      63. `zusatz4hint` text NOT NULL,
      64. `zusatz5hint` text NOT NULL,
      65. `zusatz6hint` text NOT NULL,
      66. `zusatz7hint` text NOT NULL,
      67. `zusatz8hint` text NOT NULL,
      68. `zusatz9hint` text NOT NULL,
      69. `zusatz10hint` text NOT NULL,
      70. `zusatz11hint` text NOT NULL,
      71. `zusatz12hint` text NOT NULL,
      72. `zusatz13hint` text NOT NULL,
      73. `zusatz14hint` text NOT NULL,
      74. `zusatz15hint` text NOT NULL,
      75. `zusatz16hint` text NOT NULL,
      76. `zusatz17hint` text NOT NULL,
      77. `zusatz18hint` text NOT NULL,
      78. `zusatz19hint` text NOT NULL,
      79. `zusatz20hint` text NOT NULL,
      80. `zusatz1show` tinyint(1) NOT NULL DEFAULT '0',
      81. `zusatz2show` tinyint(1) NOT NULL DEFAULT '0',
      82. `zusatz3show` tinyint(1) NOT NULL DEFAULT '0',
      83. `zusatz4show` tinyint(1) NOT NULL DEFAULT '0',
      84. `zusatz5show` tinyint(1) NOT NULL DEFAULT '0',
      85. `zusatz6show` tinyint(1) NOT NULL DEFAULT '0',
      86. `zusatz7show` tinyint(1) NOT NULL DEFAULT '0',
      87. `zusatz8show` tinyint(1) NOT NULL DEFAULT '0',
      88. `zusatz9show` tinyint(1) NOT NULL DEFAULT '0',
      89. `zusatz10show` tinyint(1) NOT NULL DEFAULT '0',
      90. `zusatz11show` tinyint(1) NOT NULL DEFAULT '0',
      91. `zusatz12show` tinyint(1) NOT NULL DEFAULT '0',
      92. `zusatz13show` tinyint(1) NOT NULL DEFAULT '0',
      93. `zusatz14show` tinyint(1) NOT NULL DEFAULT '0',
      94. `zusatz15show` tinyint(1) NOT NULL DEFAULT '0',
      95. `zusatz16show` tinyint(1) NOT NULL DEFAULT '0',
      96. `zusatz17show` tinyint(1) NOT NULL DEFAULT '0',
      97. `zusatz18show` tinyint(1) NOT NULL DEFAULT '0',
      98. `zusatz19show` tinyint(1) NOT NULL DEFAULT '0',
      99. `zusatz20show` tinyint(1) NOT NULL DEFAULT '0',
      100. `image` varchar(255) NOT NULL DEFAULT '',
      101. `file1` varchar(100) NOT NULL DEFAULT '',
      102. `file2` varchar(100) NOT NULL DEFAULT '',
      103. `file3` varchar(100) NOT NULL DEFAULT '',
      104. `file4` varchar(100) NOT NULL DEFAULT '',
      105. `file5` varchar(100) NOT NULL DEFAULT '',
      106. `file1desc` varchar(255) NOT NULL DEFAULT '',
      107. `file2desc` varchar(255) NOT NULL DEFAULT '',
      108. `file3desc` varchar(255) NOT NULL DEFAULT '',
      109. `file4desc` varchar(255) NOT NULL DEFAULT '',
      110. `file5desc` varchar(255) NOT NULL DEFAULT '',
      111. `file1down` tinyint(1) NOT NULL DEFAULT '0',
      112. `file2down` tinyint(1) NOT NULL DEFAULT '0',
      113. `file3down` tinyint(1) NOT NULL DEFAULT '0',
      114. `file4down` tinyint(1) NOT NULL DEFAULT '0',
      115. `file5down` tinyint(1) NOT NULL DEFAULT '0',
      116. `file1code` mediumtext NOT NULL,
      117. `file2code` mediumtext NOT NULL,
      118. `file3code` mediumtext NOT NULL,
      119. `file4code` mediumtext NOT NULL,
      120. `file5code` mediumtext NOT NULL,
      121. `created_by` int(11) NOT NULL DEFAULT '0',
      122. `created_by_alias` varchar(255) NOT NULL DEFAULT '',
      123. `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      124. `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      125. `modified_by` int(11) NOT NULL DEFAULT '0',
      126. `group_id` int(11) NOT NULL DEFAULT '0',
      127. `webinar` tinyint(1) NOT NULL DEFAULT '0',
      128. `booking_mail` mediumtext NOT NULL,
      129. `certificate_code` mediumtext NOT NULL,
      130. `top_event` tinyint(1) NOT NULL DEFAULT '0',
      131. `hot_event` tinyint(1) NOT NULL DEFAULT '0',
      132. `tax_id` int(11) NOT NULL DEFAULT '0',
      133. `different_fees` tinyint(1) NOT NULL DEFAULT '0',
      134. `different_fees_override` mediumtext NOT NULL,
      135. `recurring` tinyint(1) NOT NULL DEFAULT '0',
      136. `recurring_count` int(11) NOT NULL DEFAULT '0',
      137. `recurring_type` varchar(20) NOT NULL DEFAULT 'daily',
      138. `recurring_week_day` varchar(20) NOT NULL DEFAULT '1',
      139. `recurring_month_week` varchar(30) NOT NULL DEFAULT 'week1',
      140. `recurring_until` date NOT NULL DEFAULT '0000-00-00',
      141. `recurring_created` tinyint(2) NOT NULL DEFAULT '0',
      142. `language` varchar(255) NOT NULL DEFAULT '*',
      143. `asset_id` int(10) NOT NULL DEFAULT '0',
      144. `status` tinyint(4) NOT NULL DEFAULT '0',
      145. PRIMARY KEY (`id`)
      146. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='Events';
      147. CREATE TABLE `bookings` (
      148. `id` int(12) NOT NULL AUTO_INCREMENT,
      149. `name` text NOT NULL,
      150. `email` text NOT NULL,
      151. `sid` int(11) NOT NULL DEFAULT '0',
      152. `semid` int(11) NOT NULL DEFAULT '1',
      153. `userid` int(11) NOT NULL DEFAULT '1',
      154. `certificated` tinyint(1) NOT NULL DEFAULT '0',
      155. `bookingdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      156. `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      157. `grade` tinyint(1) NOT NULL DEFAULT '0',
      158. `mark` tinyint(2) NOT NULL DEFAULT '0',
      159. `comment` varchar(1000) NOT NULL DEFAULT '',
      160. `paid` tinyint(1) NOT NULL DEFAULT '0',
      161. `nrbooked` int(11) NOT NULL DEFAULT '1',
      162. `zusatz1` text NOT NULL,
      163. `zusatz2` text NOT NULL,
      164. `zusatz3` text NOT NULL,
      165. `zusatz4` text NOT NULL,
      166. `zusatz5` text NOT NULL,
      167. `zusatz6` text NOT NULL,
      168. `zusatz7` text NOT NULL,
      169. `zusatz8` text NOT NULL,
      170. `zusatz9` text NOT NULL,
      171. `zusatz10` text NOT NULL,
      172. `zusatz11` text NOT NULL,
      173. `zusatz12` text NOT NULL,
      174. `zusatz13` text NOT NULL,
      175. `zusatz14` text NOT NULL,
      176. `zusatz15` text NOT NULL,
      177. `zusatz16` text NOT NULL,
      178. `zusatz17` text NOT NULL,
      179. `zusatz18` text NOT NULL,
      180. `zusatz19` text NOT NULL,
      181. `zusatz20` text NOT NULL,
      182. `newfields` text,
      183. `uuid` varchar(255) DEFAULT '',
      184. `payment_method` varchar(255) DEFAULT 'cash',
      185. `payment_number` varchar(255) DEFAULT NULL,
      186. `payment_netto` float(11,2) DEFAULT '0.00',
      187. `payment_tax` float(11,2) DEFAULT '0.00',
      188. `payment_brutto` float(11,2) DEFAULT '0.00',
      189. `payment_plugin_data` text NOT NULL,
      190. `different_fees` varchar(1000) DEFAULT '',
      191. `coupon_code` varchar(255) DEFAULT NULL,
      192. `checked_in` tinyint(1) NOT NULL DEFAULT '0',
      193. `payment_status` varchar(255) NOT NULL DEFAULT 'P',
      194. `status` tinyint(4) NOT NULL DEFAULT '0',
      195. PRIMARY KEY (`id`)
      196. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='Bookings';
      197. CREATE TABLE `recurring` (
      198. `id` int(11) NOT NULL AUTO_INCREMENT,
      199. `event_id` int(11) NOT NULL,
      200. `semnum` varchar(255) NOT NULL,
      201. `begin` datetime NOT NULL,
      202. `end` datetime NOT NULL,
      203. `booked` datetime NOT NULL,
      204. `hits` int(11) NOT NULL DEFAULT '0',
      205. `grade` tinyint(1) NOT NULL DEFAULT '0',
      206. `cancelled` tinyint(1) NOT NULL DEFAULT '0',
      207. `published` tinyint(1) NOT NULL DEFAULT '1',
      208. PRIMARY KEY (`id`)
      209. ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='Recurring';
      Alles anzeigen


      Ich benötige ein SELECT, bei dem NUR alle Datensätze von "events" ausgeben wird, aber nur, wenn das Beginn-Datum (events.begin) und das Buchungsschluss-Datum (events.booked) <= Jetzt ist. Das ist auch soweit kein Problem. das funktioniert mit:

      SQL-Abfrage

      1. SELECT * FROM events AS e INNER JOIN recurring AS r WHERE r.event_id = e.id AND r.begin >= NOW() AND r.booked >= NOW() ORDER BY e.begin ASC


      Jetzt gibt es aber in "events" eine Spalte "nrbooked", welche aber durch die Software nicht gesetzt wird, keine Ahnung, warum.
      Ich möchte jetzt jedem Datensatz von "events" die Summe der jeweiligen Buchungen aus "bookings" zufügen.

      Und genau hier, scheitere ich. Ich weiss, dass ich mit SUM und GROUP BY arbeiten muss, aber ich habe keinen Schimmer, wie!

      Ich habe auch schon mit LEFT JOIN und RIGHT JOIN experimentiert, kein Erfolg.

      Die Abfrage:

      SQL-Abfrage

      1. SELECT e.*, b.nrbooked FROM events AS e INNER JOIN recurring AS r INNER JOIN bookings AS b WHERE r.event_id = e.id AND e.maxpupil >= b.nrbooked AND e.begin >= NOW() ORDER BY e.begin ASC


      liefert mir Datensätze aus bookings * events. Also das Produkt davon.

      Ich hoffe, dass ich dashalbwegs verständlich ausgedrückt habe.

      Hat jemand einen Tipp für mich, was ich falsch mache?

      Danke und LG
      Bernd
      Ich bin gegen Signaturen!!!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von beage ()

    • Anmerkung: Die Spalte 'semid' in "bookings" ist die 'id' in "recurring" welche widerum über die 'event_id" in "recurring" mit der 'id' in "events" verknüpft ist.

      Nicht meckern! Die Software ist nicht von mir. Es ist Matukio für Joomla. In der letzten Version war das auch alles noch ganz easy. Die haben aber die Software umgebaut und dann diese Struktur geaschaffen.
      Keine Ahnung, warum die sich solche eine Sch... einfallen lassen :(

      (Entwickler hab ich mehrfach angeschrieben, da gibt es keine Reaktion.)
      Ich bin gegen Signaturen!!!
    • Ich versteh zwar deine Aufgabenstellung, jedoch kann ich das Problem nicht ganz nachvollziehen (falsches Ergebnis oder vl SQL Fehlermeldung?).
      Wenn du beim INNER JOIN die ON Klausel weglässt, dann hast du immer einen CROSS JOIN. Meines Wissens ist nur bei MySQL die ON Klausel beim INNER JOIN optional, bei anderen großen Datenbanksystemen ist das nicht so.
    • markusschalk schrieb:

      Ich versteh zwar deine Aufgabenstellung, jedoch kann ich das Problem nicht ganz nachvollziehen (falsches Ergebnis oder vl SQL Fehlermeldung?).
      Wenn du beim INNER JOIN die ON Klausel weglässt, dann hast du immer einen CROSS JOIN. Meines Wissens ist nur bei MySQL die ON Klausel beim INNER JOIN optional, bei anderen großen Datenbanksystemen ist das nicht so.


      Es kommt nicht das raus, was ich möchte. Ich möchte alle b.nrbooked summieren und zusammen mit dem jeweiligen Event ausgeben. Die Bookings stehen aber eben nur mit einem Verweis auf die id in einer anderen Tabelle, welche widerrum nur über einen Verweis in einer 3. Tabelle erreichbar ist.
      Das ist alles total kryptisch. Ich sitze schon Stunden daran und komme einfach nicht weiter :(
      Ich bin gegen Signaturen!!!
    • SQL-Abfrage

      1. SELECT e.*, b.nrbooked FROM events AS e INNER JOIN recurring AS r INNER JOIN bookings AS b WHERE r.event_id = e.id AND e.maxpupil >= b.nrbooked AND e.begin >= NOW() ORDER BY e.begin ASC


      Ich versteh nicht ganz, wieso du die Verknüpfungsbedingung im WHERE und nicht im ON machst?
    • markusschalk schrieb:

      SQL-Abfrage

      1. SELECT e.*, b.nrbooked FROM events AS e INNER JOIN recurring AS r INNER JOIN bookings AS b WHERE r.event_id = e.id AND e.maxpupil >= b.nrbooked AND e.begin >= NOW() ORDER BY e.begin ASC


      Ich versteh nicht ganz, wieso du die Verknüpfungsbedingung im WHERE und nicht im ON machst?


      Das WHERE bezieht sich ja auf das SELECT und ON auf die Joins, richtig? Ich bekomme aber immer die gleiche Ausgabe, egal ob WHERE oder ON.
      Ich bin gegen Signaturen!!!
    • beage schrieb:

      markusschalk schrieb:

      Ok. Hast du vl ein DML Script mit ein paar Dummy Daten?


      Ich kann Dir gern einen Account in Joomla einrichten. Da siehst Du die Komponente "Matukio".

      Einen Dump der Tabellen kann ich Dir auch schicken

      Ich bräuchte eigentlich nur einen Dump der Tabellen. Das DDL Script, welches du gepostet hast, kann ich auf meiner lokalen DB einspielen.
    • SQL-Abfrage

      1. SELECT e.title, b.semid, SUM(b.nrbooked) FROM oy9zd_matukio AS e INNER JOIN oy9zd_matukio_recurring AS r ON e.id = r.event_id INNER JOIN oy9zd_matukio_bookings AS b ON r.id = b.semid WHERE r.begin >= NOW() AND r.booked >= NOW() AND e.maxpupil >= b.nrbooked GROUP BY e.title, b.semid
    • Markus, es funktioniert doch noch nicht richtig. Wenn es für ein Event noch keine Buchung gibt, dann wird das Event nicht angezeigt. Erst, wenn mindestens eine Buchung vorhanden ist.
      Wärst Du so lieb und würdest Dir das bitte nochmal anschauen?

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked) FROM #__matukio AS e INNER JOIN #__matukio_recurring AS r ON e.id = r.event_id INNER JOIN #__matukio_bookings AS b ON r.id = b.semid WHERE r.begin >= NOW() AND r.booked >= NOW() AND e.maxpupil >= b.nrbooked GROUP BY e.title, b.semid ORDER BY e.begin ASC
      Ich bin gegen Signaturen!!!
    • Sollte es nicht reichen events mit recurring und bookings per LEFT OUTER JOIN zu verknüpfen?

      Laut einer Doku zu LEFT OUTER JOIN: Äußerer linker Verbund: Alle Datensätze der Tabelle events und alle Datensätze aus den anderen Tabellen. events ohne recurring und bookings sollten enthalten sein.

      In dem Beispiel in der Doku sind jedoch nur 2 Tabellen miteinander verknüpfen, also quasi direkt events mit bookings, was bei Dir ja nur über den Umweg recurring funktioniert.

      Alternativ könntest Du es mal mit einem UNION probieren. Also einfach alle events mit recurring und bookings und dann alle events ohne recurring und bookings.
    • Probiere es mal hiermit:

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked)
      2. FROM oy9zd_matukio AS e
      3. INNER JOIN oy9zd_matukio_recurring AS r ON e.id = r.event_id
      4. LEFT OUTER JOIN oy9zd_matukio_bookings AS b ON r.id = b.semid
      5. GROUP BY e.title, b.semid
      6. ORDER BY e.begin ASC
    • beage schrieb:

      Markus, es funktioniert doch noch nicht richtig. Wenn es für ein Event noch keine Buchung gibt, dann wird das Event nicht angezeigt. Erst, wenn mindestens eine Buchung vorhanden ist.
      Wärst Du so lieb und würdest Dir das bitte nochmal anschauen?

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked) FROM #__matukio AS e INNER JOIN #__matukio_recurring AS r ON e.id = r.event_id INNER JOIN #__matukio_bookings AS b ON r.id = b.semid WHERE r.begin >= NOW() AND r.booked >= NOW() AND e.maxpupil >= b.nrbooked GROUP BY e.title, b.semid ORDER BY e.begin ASC

      MCDan schrieb:

      Sollte es nicht reichen events mit recurring und bookings per LEFT OUTER JOIN zu verknüpfen?

      Laut einer Doku zu LEFT OUTER JOIN: Äußerer linker Verbund: Alle Datensätze der Tabelle events und alle Datensätze aus den anderen Tabellen. events ohne recurring und bookings sollten enthalten sein.

      In dem Beispiel in der Doku sind jedoch nur 2 Tabellen miteinander verknüpfen, also quasi direkt events mit bookings, was bei Dir ja nur über den Umweg recurring funktioniert.

      Alternativ könntest Du es mal mit einem UNION probieren. Also einfach alle events mit recurring und bookings und dann alle events ohne recurring und bookings.


      MCDan schrieb:

      Probiere es mal hiermit:

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked)
      2. FROM oy9zd_matukio AS e
      3. INNER JOIN oy9zd_matukio_recurring AS r ON e.id = r.event_id
      4. LEFT OUTER JOIN oy9zd_matukio_bookings AS b ON r.id = b.semid
      5. GROUP BY e.title, b.semid
      6. ORDER BY e.begin ASC


      Die WHERE Klausel schränkt das Ergebnis ein. Deswegen werden nur 2 Events angezeigt. MCDan hat aber mit dem LEFT JOIN für diesen Anwendungsfall Recht.
    • MCDan schrieb:

      Probiere es mal hiermit:

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked)
      2. FROM oy9zd_matukio AS e
      3. INNER JOIN oy9zd_matukio_recurring AS r ON e.id = r.event_id
      4. LEFT OUTER JOIN oy9zd_matukio_bookings AS b ON r.id = b.semid
      5. GROUP BY e.title, b.semid
      6. ORDER BY e.begin ASC


      markusschalk schrieb:

      beage schrieb:

      Markus, es funktioniert doch noch nicht richtig. Wenn es für ein Event noch keine Buchung gibt, dann wird das Event nicht angezeigt. Erst, wenn mindestens eine Buchung vorhanden ist.
      Wärst Du so lieb und würdest Dir das bitte nochmal anschauen?

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked) FROM #__matukio AS e INNER JOIN #__matukio_recurring AS r ON e.id = r.event_id INNER JOIN #__matukio_bookings AS b ON r.id = b.semid WHERE r.begin >= NOW() AND r.booked >= NOW() AND e.maxpupil >= b.nrbooked GROUP BY e.title, b.semid ORDER BY e.begin ASC

      MCDan schrieb:

      Sollte es nicht reichen events mit recurring und bookings per LEFT OUTER JOIN zu verknüpfen?

      Laut einer Doku zu LEFT OUTER JOIN: Äußerer linker Verbund: Alle Datensätze der Tabelle events und alle Datensätze aus den anderen Tabellen. events ohne recurring und bookings sollten enthalten sein.

      In dem Beispiel in der Doku sind jedoch nur 2 Tabellen miteinander verknüpfen, also quasi direkt events mit bookings, was bei Dir ja nur über den Umweg recurring funktioniert.

      Alternativ könntest Du es mal mit einem UNION probieren. Also einfach alle events mit recurring und bookings und dann alle events ohne recurring und bookings.


      MCDan schrieb:

      Probiere es mal hiermit:

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, b.semid, SUM(b.nrbooked)
      2. FROM oy9zd_matukio AS e
      3. INNER JOIN oy9zd_matukio_recurring AS r ON e.id = r.event_id
      4. LEFT OUTER JOIN oy9zd_matukio_bookings AS b ON r.id = b.semid
      5. GROUP BY e.title, b.semid
      6. ORDER BY e.begin ASC


      Die WHERE Klausel schränkt das Ergebnis ein. Deswegen werden nur 2 Events angezeigt. MCDan hat aber mit dem LEFT JOIN für diesen Anwendungsfall Recht.


      Ich danke euch tausend mal!! Jetzt klappt es super! Ich habe noch ein paar kleine Modifikationen vorgenommen:

      SQL-Abfrage

      1. SELECT e.title, e.shortdesc, e.description, e.fees, e.tax_id, e.maxpupil, e.minpupil, e.begin, e.end, e.booked, e.image, r.id AS semid, SUM(b.nrbooked) AS nrbooked
      2. FROM #__matukio AS e INNER JOIN #__matukio_recurring AS r ON e.id = r.event_id
      3. LEFT OUTER JOIN #__matukio_bookings AS b ON r.id = b.semid
      4. WHERE r.begin >= NOW() AND r.booked >= NOW()
      5. GROUP BY e.title, b.semid
      6. ORDER BY e.begin ASC


      LG Bernd
      Ich bin gegen Signaturen!!!