Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Bereits vorhandene Werte nicht in Query aufnehmen (https://www.delphipraxis.net/87469-bereits-vorhandene-werte-nicht-query-aufnehmen.html)

faux 1. Mär 2007 05:57

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

Bereits vorhandene Werte nicht in Query aufnehmen
 
Hallo!

Welche Rows werden eigentlich durch ein GROUP BY ausgeblendet? Alle bis auf das Letze oder alle bis auf das Erste oder gibt es da keine Regel?

Mein Problem:
Ich habe eine Tabelle in der die persönlichen Einstellungen der Benutzer gespeichert werden:
Code:
+---------------+--------------+
| Field        | Type        |
+---------------+--------------+
| user_id      | int(10)     |
| setting_name | varchar(25) |
| setting_value | varchar(255) |
+---------------+--------------+
Die Standardeinstellungen, die greifen, wenn der User nichts spezielles eingestellt hat werden über user_id = -1 identifiziert.
Ich will eine Abfrage schreiben in der alle Eigenschaften vorkommen, alle von -1 die dann durch die Benutzereigenschaften überschrieben werden.

Mein erster Versuch:
SQL-Code:
SELECT setting_name, setting_value
FROM settings
WHERE user_id = -1
   OR user_id = <user_id>
ORDER BY user_id ASC
Jetzt kommt jede Eigenschaft mindestens einmal vor als Default, sollte der User eine eigene Einstellung haben, so wird diese danach ebenfalls gelistet. Mit folgendem Code führe ich dann die Einstellungen zusammen. Zuerst werden alle Default-Einstellungen in den Array gespeichert und danach ev. mit den Benutzereinstellungen überschrieben.
Code:
$settings = array();
while ($row = $db->fetchrow($result))
{
   $settings[$row['setting_name']] = $row['setting_value'];
}
Das ist jedoch nicht so wie ich will, das ist unnötige Arbeit.

Frage:
Wie kann ich das gleich per SQL erreichen, dass zwar jede Default-Eigenschaft vorkommt, jedoch ev. von Benutzereinstellungen überschrieben wird, wenn vorhanden.
Hätte schon an so etwas gedacht, aber keine Ahnung ob das funktioniert:
SQL-Code:
SELECT setting_name, setting_value
FROM settings
WHERE user_id = -1
   OR user_id = <user_id>
ORDER BY user_id ASC
GROUP BY setting_name
Deswegen auch die Frage zu GROUP BY.

Grüße
Faux

mkinzler 1. Mär 2007 06:37

Re: Bereits vorhandene Werte nicht in Query aufnehmen
 
Hast du schon distinct ausprobiert?

marabu 1. Mär 2007 08:53

Re: Bereits vorhandene Werte nicht in Query aufnehmen
 
Hallo,

eigentlich sollte es funktionieren, wenn man die Anforderung direkt in SQL übersetzt:

SQL-Code:
/* alle Einstellungen von User 1 */
SELECT user_id, setting_name, setting_value
FROM settings
WHERE user_id = 1

/* und dazu */
UNION

/* nur die Einstellungen vom default user, */
/* die noch nicht bekannt sind */
SELECT user_id, setting_name, setting_value
FROM settings
WHERE user_id = -1 and not setting_name in (SELECT setting_name FROM settings WHERE user_id = 1)
Getippt und nicht getestet.

Grüße vom marabu


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