Abfrage aus 3 Tabellen, welche Reihenfolge?

Kalma

Erfahrenes Mitglied
Hallo,

ich habe folgendes Suchformular:
http://vs165143.vserver.de/myexperte_alpha/suche.php?type=2

Dort kann man folgendes Suchen:
Thema
Erreichbarkeit

Beides ist eine eigene Tabelle.
Folgendes Layout:
suchwoerter (aka thema)
swort_id
swort_besitzer (id des benutzers, der diese suchwoerter eingetragen hat)
swort_text (z.b. musik, schlagzeug, klobürste etc)

suchwoerter_erreichbarkeit
call_id
call_benutzer_id (id des benutzers, der diese suchwoerter eingetragen hat)
call_swort_id (id der suchwoerter zur zuordnung der zeiten)
call_ab
call_bis
call_tag
call_immer



Jetzt frage ich mich, wie krieg ich das am Besten verglichen.
Ich muss ja gucken, existiert das Thema und welcher Benutzer hat das eingeben und stimmen die Erreichbarkeiten?
Wie mache ich das am Besten?!

Und noch eine Frage.
Wie prüfe ich, ob ein Benutzer zwischen den Zeiten liegt, die der Suchende eingegeben hat?
Zum Beispiel, Ich suche ab 14:00 Uhr bis 19:00
Dann sollte ja auch ein Benutzer gefunden werden, der von 15:00 bis 16:00 erreichbar ist, oder nicht?
Wie mach ich das?=


danke im vorraus
david
 
Zunächst scheinst du deutsch und englisch zu mischen für die Benennung deiner Spalten. Mein Tipp wäre: Entscheide dich für deutsch oder englisch und bleibe dann für dieses Projekt dabei. Die Mischung beider Sprachen führt dazu, schnell den Durchblick zu verlieren.
Die ID des Suchwortbesitzers ist in beiden Tabellen redundant vorhanden. Hat diese Redundanz einen Grund? Wenn nicht solltest du eine dieser Angaben entfernen. Irgendwie klingt es so als wäre die Erreichbarkeit mit dem Suchwort verbunden. Ich habe zwar keine Ahnung von deiner Anwendung aber Erreichbarkeit klingt für mich eher nach Erreichbarkeit einer Person, ergo eines Benutzers. Vielleicht solltest du überlegen die Erreichbarkeit mit einem Benutzer zu verknüpfen und nicht mit einem Suchwort.

Zu einer Lösungsmöglichkeit anhand deiner geposteten Struktur:
Du könntest für die Spalten call_ab und call_bis den MySQL Time-Typ benutzen. Aber Achtung: Der kann auch für Uhrzeiten verwendet werden, ist aber eigentlich für eine Angabe eines Zeitintervalls gedacht.

Die Abfrage könnte dann in etwa so lauten:

SELECT * FROM suchwoerter s LEFT JOIN suchwoerter_erreichbarkeit e ON s.swort_id=e.call_swort_id WHERE s.swort_text='klobürste' AND (
(call_von>=1400 AND call_von<=1900)
OR
(call_bis>=1400 AND call_bis<=1900)
)

Ich habe angenommen, dass ein Benutzer dann gefunden werden soll wenn sich das eingegebene Zeitintervall für die Suche mit dem Zeitintervall der Erreichbarkeit des Benutzers in irgendeiner Form überschneidet. Muss das Intervall Erreichbarkeit im zu suchenden Zeitintervall enthalten sein: Kannst du das ja einfach über call_von>=1400 AND call_bis<=1900 erreichen.
 
Zuletzt bearbeitet:
Ich habe zwar keine Ahnung von deiner Anwendung aber Erreichbarkeit klingt für mich eher nach Erreichbarkeit einer Person, ergo eines Benutzers. Vielleicht solltest du überlegen die Erreichbarkeit mit einem Benutzer zu verknüpfen und nicht mit einem Suchwort.


Nein, das ganze läuft so.
Es gibt einen Benutzer, der hat verschiedene Themen.
Beispiel Einträge
Id | Benutzer ID | Thema
1 1 Musik
2 1 Politik
3 2 Töpfern

So, jetzt ist der Benutzer 1 zum Thema Musik zu folgenden Zeiten erreichbar
Id | Thema ID | ab | bis | tag | immer (alternativ, sonst 0)
1 1 14:00 17:00 montag
2 1 13:00 19:00 dienstag


Ich hoffe das ist so verständlich, warum ich die erreichbarkeit nicht mit dem benutzer verknüpfen kann.


In deinem Beispiel hast du
PHP:
SELECT * FROM suchwoerter s LEFT JOIN suchwoerter_erreichbarkeit e ON s.swort_id=e.call_swort_id WHERE s.swort_text='klobürste' AND (
(call_von>=1400 AND call_von<=1900)
OR
(call_bis>=1400 AND call_bis<=1900)
)

(call_von>=1400 AND call_von<=1900)
Dieses drin.
Da steht 1400 und 1900
Bei mir wird die Zeit ja mit : gespeichert, also 14:00 und 19:00
Kann ich das Beispiel so trotzdem anwenden?`Sprich:
PHP:
SELECT * FROM suchwoerter s LEFT JOIN suchwoerter_erreichbarkeit e ON s.swort_id=e.call_swort_id WHERE s.swort_text='klobürste' AND (
(call_von>=14:00 AND call_von<=19:00)
OR
(call_bis>=14:00 AND call_bis<=19:00)
)




Danke schonmal für die Antwort
 
Ok so macht das natürlich Sinn.

Ob du es verwenden kannst hängt vom genauen Typ der Spalten call_von und call_bis ab. Wenn call_von und _bis varchar's sind wäre ich mir nicht sicher ob es funktioniert, da die Vergleichsoperatoren < und > dann Stringvergleiche machen. Es könnte jedoch trotzdem funktionieren wenn der String 14:59 für MySQL kleiner als 15:00 ist. Das müsstest du mal ausprobieren.
Du solltest jedoch bedenken, dass eine solche Suche auf einer varchar-Spalte wahrscheinlich deutlich langsamer ist als eine Suche auf einer Time- oder Int-Spalte.

Cooles Konzept übrigens, das deinem Projekt zu Grunde liegt.
 
Zuletzt bearbeitet:
Hi,

Ich habe einen Varchar Typ und es funktioniert.

Die Suchfunktion ist beendet und funktioniert.
Danke nochmal!!


Danke für das Kompliment :p


mfg
David
 

Neue Beiträge

Zurück