AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Abfragen zusammenfassen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfragen zusammenfassen

Ein Thema von Matze · begonnen am 6. Jul 2006 · letzter Beitrag vom 6. Jul 2006
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 06:07
Datenbank: MySQL • Version: 4 • Zugriff über: PHP
Hallo zusammen,

es geht ums Auslesen von Einträgen eines Blogs.

Ich nutze folgende 4 MySQL-Queries in einer PHP-Datei, wobei hierbei nur die ersten 3 relevant sein dürften (seltsam gehighlighted, ich weiß):

Code:
// get blog entry
$sql_query = "[b]SELECT[/b] b.*, bd.*
   [b]FROM[/b] " . BLOG_ENTRIES . " b
   [b]LEFT JOIN[/b] " . BLOG_ENTRIES_DATA . " bd
   [b]ON[/b] b.blog_id = bd.blog_id
   [b]WHERE[/b] b.lang = " . sqlval($site_lang['lang_short']) . "
   [b]AND[/b] b.blog_id = " . sqlval($id) . "
   [b]AND[/b] bd.blog_show = 1";
Code:
// get navigation links

// previous entry
$sql_query = "[b]SELECT[/b] bd.blog_id, b.blog_title
   [b]FROM[/b] " . BLOG_ENTRIES . " b
   [b]LEFT JOIN[/b] " . BLOG_ENTRIES_DATA . " bd
   [b]ON[/b] b.blog_id = bd.blog_id
   [b]LEFT JOIN[/b] " . BLOG_CATEGORIES_DATA . " bcd
   [b]ON[/b] bd.blog_cat_id = bcd.blog_cat_id
   [b]WHERE[/b] b.lang = " . sqlval($site_lang['lang_short']) . "
   [b]AND[/b] bcd.blog_cat_show = 1
   [b]AND[/b] bd.blog_id > " . $id . "
   [b]ORDER BY[/b] bd.blog_id [b]ASC[/b]
   [b]LIMIT[/b] 1";

[...]

// next entry
$sql_query = "[b]SELECT[/b] bd.blog_id, b.blog_title
   [b]FROM[/b] " . BLOG_ENTRIES . " b
   [b]LEFT JOIN[/b] " . BLOG_ENTRIES_DATA . " bd
   [b]ON[/b] b.blog_id = bd.blog_id
   [b]LEFT JOIN[/b] " . BLOG_CATEGORIES_DATA . " bcd
   [b]ON[/b] bd.blog_cat_id = bcd.blog_cat_id
   [b]WHERE[/b] b.lang = " . sqlval($site_lang['lang_short']) . "
   [b]AND[/b] bcd.blog_cat_show = 1
   [b]AND[/b] bd.blog_id < " . $id . "
   [b]ORDER BY[/b] bd.blog_id [b]DESC[/b]
   [b]LIMIT[/b] 1";
Code:
// get blog_category
$sql_query = "[b]SELECT[/b] bd.*, b.*
   [b]FROM[/b] " . BLOG_CATEGORIES . " b
   [b]LEFT JOIN[/b] " . BLOG_CATEGORIES_DATA . " bd
   [b]ON[/b] b.blog_cat_id = bd.blog_cat_id
   [b]WHERE[/b] b.lang = " . sqlval($site_lang['lang_short']) . "
   [b]AND[/b] b.blog_cat_id = " . sqlval($blog_entry['blog_cat_id']) . "
   [b]AND[/b] bd.blog_cat_show = 1
   [b]ORDER BY[/b] bd.blog_cat_id [b]DESC[/b]";
Ich habe schon mit einer Person gesprochen, die sich mit SQL recht gut auskennt, und da mussten wir leider mit obigen Queries verbleiben, was mit jedoch nicht sonderlich gut gefällt, gerade 2 Abfragen für den nächsten/vorigen Eintrag. Vielleicht kennt ihr eine schönere Möglichkeit.
Die 2 mittleren Abfragen (hier der 2. Code-Block) sind je dafür da, den vorigen und den nächsten Blog-Eintrag samt Titel auszulesen. Mit UNION konnte ich das nicht zusammenfassen, da es dann Probleme mit ORDER BY gibt (wieso auch immer). Ganz schön wäre es, wenn man die ersten 3 Abfragen zusammenfassen könnte, natürlich so, dass das noch übersichtlich bleibt.

Ist sowas möglich, wenn ja, wie?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 06:28
Hallo Matthias,

mehrere singleton selects sind immer suspekt. In deinem Fall würde ich den aktuellen Datensatz zusammen mit Vorgänger und Nachfolger anfragen:

Code:
...
AND b.blog_id in (" . sqlval($id-1) . sqlval($id) . sqlval($id+1) . ")
...
Ich hoffe du erkennst die Idee trotz eventuell vorhandener Syntaxfehler.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 17:03
Hallo marabu

Zitat von marabu:
Code:
...
AND b.blog_id in (" . sqlval($id-1) . sqlval($id) . sqlval($id+1) . ")
...
Ich hoffe du erkennst die Idee trotz eventuell vorhandener Syntaxfehler.
Die Idee erkenne ich, nur ist das Problem, dass die IDs nicht fortlaufend sein müssen, es kann auch mal eine ID fehlen.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 18:10
Hallo Matze,

vielleicht so...

SQL-Code:
SELECT 'get blog entry' typ, 1 sort, b.*, bd.*
FROM BLOG_ENTRIES b
LEFT JOIN BLOG_ENTRIES_DATA bd
  ON b.blog_id = bd.blog_id
WHERE b.lang = sqlval($site_lang['lang_short'])
  AND b.blog_id = sqlval($id)
  AND bd.blog_show = 1

UNION

SELECT 'previous entry' typ, 2 sort, b.*, bd.*
FROM BLOG_ENTRIES b
LEFT JOIN BLOG_ENTRIES_DATA bd
  ON b.blog_id = bd.blog_id
LEFT JOIN BLOG_CATEGORIES_DATA bcd
  ON bd.blog_cat_id = bcd.blog_cat_id
WHERE b.lang = sqlval($site_lang['lang_short'])
  AND bcd.blog_cat_show = 1
  AND bd.blog_id = (SELECT MAX(bd.blog_id)
                    FROM BLOG_ENTRIES b
                    LEFT JOIN BLOG_ENTRIES_DATA bd
                      ON b.blog_id = bd.blog_id
                    LEFT JOIN BLOG_CATEGORIES_DATA bcd
                      ON bd.blog_cat_id = bcd.blog_cat_id
                    WHERE b.lang = sqlval($site_lang['lang_short'])
                      AND bcd.blog_cat_show = 1
                      AND blog_id < $id)

UNION

SELECT 'next entry' typ, 3 sort, b.*, bd.*
FROM BLOG_ENTRIES b
LEFT JOIN BLOG_ENTRIES_DATA bd
  ON b.blog_id = bd.blog_id
LEFT JOIN BLOG_CATEGORIES_DATA bcd
  ON bd.blog_cat_id = bcd.blog_cat_id
WHERE b.lang = sqlval($site_lang['lang_short'])
  AND bcd.blog_cat_show = 1
  AND bd.blog_id = (SELECT MIN(bd.blog_id)
                    FROM BLOG_ENTRIES b
                    LEFT JOIN BLOG_ENTRIES_DATA bd
                      ON b.blog_id = bd.blog_id
                    LEFT JOIN BLOG_CATEGORIES_DATA bcd
                      ON bd.blog_cat_id = bcd.blog_cat_id
                    WHERE b.lang = sqlval($site_lang['lang_short'])
                      AND bcd.blog_cat_show = 1
                      AND blog_id > $id)


UNION

SELECT 'get blog_category' typ, 4 sort, b.*, bd.*
FROM BLOG_ENTRIES b
LEFT JOIN BLOG_ENTRIES_DATA bd
  ON b.blog_id = bd.blog_id
LEFT JOIN BLOG_CATEGORIES_DATA bcd
  ON bd.blog_cat_id = bcd.blog_cat_id
WHERE b.lang = sqlval($site_lang['lang_short'])
  AND bd.blog_cat_show = 1
  AND b.blog_cat_id = sqlval($blog_entry['blog_cat_id'])

ORDER BY sort ASC, bd.blog_cat_id DESC
Gruss
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 18:40
Hallo Thorsten

Zitat von omata:
vielleicht so...
Nettes Query, doch das werde ich in wenigen Monaten nicht mehr verstehen und ich möchte den Code so erstellen, dass man die Webseite auch leicht warten, sprich ich einem Jahr auch noch ohne langes Überlegen verstehen kann. Dennoch danke.

Dann belasse ich es wohl bei 4 Abfragen ...
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 18:48
Was ist daran unverständlich? Jeder Block ist doch für sich selbst super einfach. Und die Spalte Typ liefert dir sogar die Beschreibung vom jeweiligen Block.

Naja, dann eben nicht. Hätte mich trotzdem interessiert, ob das das ist was du haben wolltest (und auch liefert) und ob die Anweisung überhaupt funktioniert (weil ungetestet ausm Kopf)

Schade...
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 19:03
Hi,

nach der Korrektur ein paar kleinerer Fehler erhalte ich nun diesen Fehler, den ich mir eigentlich nicht erklären kann:

Zitat:
Unknown table 'bd' in order clause
Ohne ORDER BY erhalte ich das hier, also es scheint schon zu funktionieren, in dem Fall sogar richtig (ohne ORDER BY).

Code:
Array
(
    [0] => Array
        (
            [typ] => get blog entry
            [sort] => 1
            [blog_id] => 110
            [blog_title] => Vorpraktikum - Tag 13 [Woche 3]
            [blog_message] => Die 10 Messgeräte [...]
            [lang] => de
            [blog_date] => 1149189152
            [blog_author] => Matze
            [blog_cat_id] => 4
            [blog_show] => 1
        )

    [1] => Array
        (
            [typ] => previous entry
            [sort] => 2
            [blog_id] => 109
            [blog_title] => Vorpraktikum - Tag 12 [Woche 3]
            [blog_message] => Heute habe ich beim Zusammenschrauben [...]
            [lang] => de
            [blog_date] => 1149104142
            [blog_author] => Matze
            [blog_cat_id] => 4
            [blog_show] => 1
        )

    [2] => Array
        (
            [typ] => next entry
            [sort] => 3
            [blog_id] => 111
            [blog_title] => Vorpraktikum - Tag 14 [Woche 3]
            [blog_message] => Ich habe am heutigen Tag deutlich mehr geschafft [...]
            [lang] => de
            [blog_date] => 1149278354
            [blog_author] => Matze
            [blog_cat_id] => 4
            [blog_show] => 1
        )

)
[blog_message] habe ich abgekürzt
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 19:05
Und wenn du einfach schreibst...

ORDER BY sort ASC, blog_cat_id DESC
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: SQL-Abfragen zusammenfassen

  Alt 6. Jul 2006, 19:11
Zitat von omata:
Und wenn du einfach schreibst...
Hm Tatsache, das geht.

Irgendwie gefällt mir das erzeugte Array, ich glaube, ich bleibe vorerst mal dabei. Mal sehen, wie performant das läuft. Danke nochmals.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz