Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Abfragen zusammenfassen (https://www.delphipraxis.net/72739-sql-abfragen-zusammenfassen.html)

Matze 6. Jul 2006 06:07

Datenbank: MySQL • Version: 4 • Zugriff über: PHP

SQL-Abfragen zusammenfassen
 
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?

marabu 6. Jul 2006 06:28

Re: SQL-Abfragen zusammenfassen
 
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

Matze 6. Jul 2006 17:03

Re: SQL-Abfragen zusammenfassen
 
Hallo marabu

Zitat:

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.

omata 6. Jul 2006 18:10

Re: SQL-Abfragen zusammenfassen
 
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

Matze 6. Jul 2006 18:40

Re: SQL-Abfragen zusammenfassen
 
Hallo Thorsten

Zitat:

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 ...

omata 6. Jul 2006 18:48

Re: SQL-Abfragen zusammenfassen
 
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...

Matze 6. Jul 2006 19:03

Re: SQL-Abfragen zusammenfassen
 
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

omata 6. Jul 2006 19:05

Re: SQL-Abfragen zusammenfassen
 
Und wenn du einfach schreibst...

SQL-Code:
ORDER BY sort ASC, blog_cat_id DESC

Matze 6. Jul 2006 19:11

Re: SQL-Abfragen zusammenfassen
 
Zitat:

Zitat von omata
Und wenn du einfach schreibst...

Hm Tatsache, das geht. :gruebel:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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