MySQL: получить даты с и без категории / подкатегории в одном запросе (и отсортированы)

0

У меня есть база данных с 4 таблицами с этой структурой:

  • Категория
  • подкатегорий
  • даты
  • События

У нас есть события, которые могут иметь несколько дат. События подразделяются на категории и подкатегории, но могут иметь только категорию и подкатегорию.

Я попробовал этот запрос:

SELECT
    t.id as sortid,
    t.numprint,
    s.titel,
    s.intro,
    s.inhalte,
    s.zielgruppe,
    s.methoden,
    s.kapitelprint,
    s.unterkapitelprint,
    t.ort,
    t.bundesland,
    t.email,
    t.telefon,
    t.preis,
    t.dateprint
FROM
    kapitel k
LEFT JOIN
    unterkapitel u
    ON u.parent = k.id
LEFT JOIN
    seminare s
    ON s.kapitel = k.id
    AND s.unterkapitel = u.id
    AND s.aktiv = 1
LEFT JOIN
    termine t
    ON t.parent = s.id

Но это не приводит к событиям без подкатегории - все они имеют NONE во всех полях. Есть ли способ получить все даты в одном запросе?

Спасибо заранее, Sebastian

  • 0
    Пожалуйста, предоставьте свою схему базы данных. Кроме того, ваши запросы выбора в и s, но они никогда не определяются в предложении from или join.
  • 0
    Привет, Джош, извини, я обновил свой запрос. Мой оригинальный запрос содержит немецкие имена полей, которые некоторые могут не понимать - поэтому я перевел запрос на английский. Теперь я разместил свой оригинальный запрос - надеюсь, что большинство все равно поймет, что я делаю.
Показать ещё 3 комментария
Теги:

2 ответа

0

Wrikken, спасибо! Но это не возвращает правильный порядок.

Мне нужны все события (termine) из всех kapitel (категорий), включая их unterkapitel (подкатегории), но в их правильном порядке:

  • пример даты 1 с категорией a
  • пример даты 2 с категорией b, подкатегория b.a
  • пример даты 3 с категорией b, подкатегория b.a
  • пример даты 4 с категорией b, подкатегория b.b
  • пример даты 6 с категорией b, подкатегория b.c
  • пример даты 7 с категорией c, подкатегория c.a

... и т.д.

т.е.: перейдите в категории, верните любые даты без подкатегории или перейдите в подкатегории, запустите все их и верните все даты из этих подкатегорий.

на данный момент я делаю эту логику внутри своего python script, но я думал, что это должно быть возможно с MySQL напрямую.

  • 0
    Я не совсем уверен в этом (и я бы посоветовал добавить это к вашему вопросу в редактировании, а не в качестве ответа). Еще не было оговорки о заказе, но из вашего примера я бы сказал, что простой ORDER BY k.id, u.id IS NULL, u.id должен ORDER BY k.id, u.id IS NULL, u.id ? Или нужно сначала отсортировать по термину?
0

ОК, последний снимок:

если вы хотите, чтобы все капители, независимо от того, имеют ли они событие.

SELECT * 
FROM kapitel k

LEFT JOIN seminare s
ON s.kapitel = k.id
    AND s.aktiv = 1

LEFT JOIN termine t
ON t.parent = s.id

LEFT JOIN unterkapitel u
ON u.parent = k.id
    AND s.unterkapitel = u.id

Если вы хотите только события /siminare:

SELECT * 
FROM seminare s

JOIN kapitel k
ON s.kapitel = k.id
    AND s.aktiv = 1

LEFT JOIN termine t
    ON t.parent = s.id

LEFT JOIN unterkapitel u
ON u.parent = k.id
    AND s.unterkapitel = u.id

Но мне действительно не нравится, что теоретически возможно, что на семинаре могут быть Капитал и Унтеркапитель, которые не связаны (что можно, конечно, предотвратить в script), я продолжаю думать, что должно быть лучший вариант для этого, но единственное, о чем я могу думать, это слияние Kapitel и Unterkapitel в 1 таблицу с простой моделью Adjancency, которая позволяет вам свободно вводить Kapitel или Unterkapitel в одном поле "kapitel" в Seminare, отбрасывая Unterkapitel поле полностью.

  • 0
    Ну, это не работает, как ожидалось. Строки должны быть 356, теперь это 374. ВЫБЕРИТЕ t.id как сорт, t.numprint, s.ititel, s.intro, s.inhalte, s.zielgruppe, s.methoden, s.kapitelprint, s.unterkapitelprint, t. ort, t.bundesland, t.email, t.telefon, t.preis, t.dateprint FROM kapitel k СЛЕДУЮЩИЙ ПРИСОЕДИНЯЙТЕСЬ к unterkapitel u ON u.parent = k.id СЛЕДУЮЩИЙ ПРИСОЕДИНЯЙТЕСЬ К семинарам ON s.kapitel = k.id AND ( s.unterkapitel = u.id ИЛИ s.unterkapitel НЕДЕЙСТВИТЕЛЕН) И s.aktiv = 1 СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ К ТЕРМИНУ t ON t.parent = s.id
  • 0
    Черт, я чувствую себя здесь как новичок;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню