![]() |
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:
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.
// 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]"; 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? |
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:
Ich hoffe du erkennst die Idee trotz eventuell vorhandener Syntaxfehler.
...
AND b.blog_id in (" . sqlval($id-1) . sqlval($id) . sqlval($id+1) . ") ... Grüße vom marabu |
Re: SQL-Abfragen zusammenfassen
Hallo marabu
Zitat:
|
Re: SQL-Abfragen zusammenfassen
Hallo Matze,
vielleicht so...
SQL-Code:
Gruss
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 Thorsten |
Re: SQL-Abfragen zusammenfassen
Hallo Thorsten
Zitat:
Dann belasse ich es wohl bei 4 Abfragen ... |
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... |
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:
Code:
[blog_message] habe ich abgekürzt
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 ) ) |
Re: SQL-Abfragen zusammenfassen
Und wenn du einfach schreibst...
SQL-Code:
ORDER BY sort ASC, blog_cat_id DESC
|
Re: SQL-Abfragen zusammenfassen
Zitat:
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 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz