PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage aus zwei Tabllen


simca
20.08.2005, 16:12:41
Moin,

ich bastel grade an einem kleinen PHP/SQL-Projekt und seh grade den Wald vor lauter Bäumen nicht.

Verkürztes Beispiel:

Tabelle entries mit den Spalten datum und text
Tabelle conf mit der Spalte datum

Jetzt möchte ich aller Einträge aus entries haben, bei denen datum nach datum aus conf liegt, also entries.datum > conf.datum

Gibt es eine Möglichkeit, das mit einer Abfrage zu erschlagen?
Anders gefragt: Kann ich einen Join auf die Tabellen machen ohne eine on-Bedingung zu haben?

Grüße
Simca

feuervogel
20.08.2005, 17:08:53
das problem wird sein, dass ja nicht klar ist, welche zeile aus conf gemeint ist, denn so wird das kreuzprodukt gebildet aus beiden tabellen mit allen zeilen, wo halt conf.datum < entries.datum...

wie sieht denn deine bisherige abfrage aus?

edit:

willkommen im forum!

simca
20.08.2005, 17:29:26
wie sieht denn deine bisherige abfrage aus?

Momentan löse ich das mit zwei Abfragen:
1. SELECT datum FROM conf
2. Ergebnis -> $datum
3. SELECT text FROM entries WHERE datum>$datum

(Verkürzt. Im Projekt nutze ich AdoDB, da sieht das etwas eleganter aus... ;-))


willkommen im forum!
Danke! :-)

feuervogel
20.08.2005, 18:46:34
öhm, conf hat nur eine zeile?

dann kannst du das in einem join lösen, respektive die beiden tabellen miteinander verknüpfen...

SELECT
`t1`.`datum`,
`t1`.`text`
FROM
`entries` AS `t1`,
`conf` AS `t2`
WHERE
`t1`.`datum` > `t2`.`datum`

ist zwar nicht getestet, müsste aber hinhauen...

simca
20.08.2005, 20:03:19
SELECT
`t1`.`datum`,
`t1`.`text`
FROM
`entries` AS `t1`,
`conf` AS `t2`
WHERE
`t1`.`datum` > `t2`.`datum`


Aarggl...
Ich überlegte die ganze Zeit in Richtung
SELECT ...
FROM entries AS a
LEFT JOIN conf AS b ON ???

Ich sollte wohl Feierabend machen... ;-)

Nur für's Protokoll: Ich hab mich jetzt für eine andere Lösung entschieden.
Die gesamte Tabelle conf (die, wie der Name andeutet, Konfigurationsparameter enthält) wird am Anfang der Skripte ausgelesen, in Konstanten geschrieben und gut is...

Danke und Grüße

feuervogel
20.08.2005, 20:27:33
aha, nun denn, so langs funktioniert ist ja ok :-)

xabbuh
21.08.2005, 00:42:49
Die gesamte Tabelle conf (die, wie der Name andeutet, Konfigurationsparameter enthält) wird am Anfang der Skripte ausgelesen, in Konstanten geschrieben und gut is...
Das geht aber auch nur so lange gut, wie die Größe der Tabelle relativ klein ist.

simca
21.08.2005, 10:14:05
Das geht aber auch nur so lange gut, wie die Größe der Tabelle relativ klein ist.

Na ja, was ist schon "relativ klein"? ;-)
So wie ich das jetzt abschätze, werden das 20-30 Parameter, die ich zur Laufzeit der verschiedenen Skripte eh benötige.
Da kann ich die Dinger genausogut am Anfang auslesen und hab sie dann überall zur Verfügung.
Wie gesagt, wir reden hier nicht von mehreren 100 Parametern.
Das sollte also überhaupt kein Problem sein.

feuervogel
21.08.2005, 12:22:55
sowas kann man aber doch auch in eine config-datei schreiben die dann am anfang ein mal includiert wird...naja, viele wege führen nach rom.

simca
21.08.2005, 13:16:29
sowas kann man aber doch auch in eine config-datei schreiben die dann am anfang ein mal includiert wird...naja, viele wege führen nach rom.

Jaaaa, aber....
Das Ganze soll später Multiuserfähig sein, jeder User hat individuelle Config-Parameter.
Da ist es meiner Meinung nach schon sinnvoll, das in eine DB zu packen.

feuervogel
21.08.2005, 13:25:58
oh, dann wirst du wohl für jeden user ne zeile anlegen müssen? und wenns 30 parameter sind, hat die tabelle dann 30 spalten (was relativ unschön ist).

und wenn du für jeden benutzer ne zeile anlegst, in der auch die benutzer-id gespeichert ist, hättest du ja sogar ne verknüpfungsbedingung...

simca
21.08.2005, 13:40:25
oh, dann wirst du wohl für jeden user ne zeile anlegen müssen? und wenns 30 parameter sind, hat die tabelle dann 30 spalten (was relativ unschön ist).


Hmm, ist meiner Meinung nach aber die beste Lösung.
Was wäre denn die Alternative?


und wenn du für jeden benutzer ne zeile anlegst, in der auch die benutzer-id gespeichert ist, hättest du ja sogar ne verknüpfungsbedingung...

Klar, es wird dann eine Spalte user_id geben.
Nur, was bringt mir das? Womit soll ich die in diesem Fall verknüpfen?

Im übrigen brauche ich den Großteil der Conf-Parameter an mehreren Stellen in diversen Skripten.
Bevor ich da jedesmal eine Abfrage an die DB schicke, ist es doch eleganter, die Dinger _alle_ am Anfang einzulesen und als Konstanten zur Verfügung zu stellen.

Oder steh ich völlig auf dem Schlauch?

feuervogel
21.08.2005, 13:44:18
hm, stimmt schon, ich denke wahrscheinlich mal wieder viel zu kompliziert :-)

xabbuh
21.08.2005, 13:44:24
Die Tabelle könnte dann so aussehen:
userid
var
value

Und so kannst du dann für jeden Benutzer beliebig viele Einstellungen speichern.

Anschließend kannst du für den gerade eingeloggten Benutzer die Einstellungen ermitteln:

$sql = "SELECT
var,
value
FROM
conf
WHERE
userid = $userid";

feuervogel
21.08.2005, 13:46:18
stimmt, weil für jeden neuen config-paramter ne neue spalte anzulegen ist arg unschön...

simca
21.08.2005, 13:52:09
Die Tabelle könnte dann so aussehen:
userid
var
value


Yep, mit dem Gedanken habe ich auch schon gespielt.
Alledings haben die Conf-Paramter unterschiedliche Typen, Integer, String, insbesondere sind diverse Datums-Variablen dabei.

Hmmm, ist es da schlau, value z.B. als varchar(20) anzulegen?

Wobei Du natürlich recht hast, daß das Tabellenlayout so wesentlich eleganter wäre.

xabbuh
21.08.2005, 14:13:44
VARCHAR() als Spaltentyp zu verwenden, dürfte da recht ratsam sein. Du kannst natürlich auch in einer Spalte erst einmal definieren, wie der Typ der Variablen ist und für die unterschiedlichen Typen (Integer, String, Date) eine extra Spalte anlegen und nur die für den Typ mit einem Wert belegen.