Liebe Leute,
Ich hab von SQL leider nur wenig Ahnung und benutze es normalerweise nur für grundlegende Abfragen. Ausnahmsweise habe ich aber ein kompliziertes Anliegen: Das Kommando besteht aus einem String, den ich aus PHP Code generiere. Dabei sollen alle Zeilen, die SUCHTEXT in irgendeiner Kolonne der Tabellen tab1, tab3 und tab6 enthalten (Like-Befehl); Das Resultat soll von doppelten Zeilen befreit die Zeilen sollen nach dem jeweiligen Eintrag in der Kolonne „wdate“ sortiert sein.
Wie würde dieser Befehl aussehen?
lg und vielen Dank im Voraus
Kalsan
Hallo Kalsan,
für ein „kompliziertes Anliegen“ wären mehr Informationen nötig, z.B. Tabellenstrukturen, Beispieldaten, bisherige Lösungsversuche …
Peter
Hallo Kalsan,
Hallo Peter,
für ein „kompliziertes Anliegen“ wären mehr Informationen
nötig, z.B. Tabellenstrukturen,
Jede Tabelle ist anders und hat eine andere Anzahl Spalten. Folgende Punkte haben alle Tabellen gemeinsam:
- Die Einträge sind entweder im Format tinyint (boolean), int oder text
- Jede Tabelle hat eine Spalte, die wdate heisst, und eine Spalte id
- Es ist keine Zelle leer.
Beispieldaten,
tab1: id, text, titel, wdate
Beispieleinträge: 5, Wie geht’s?, Anmache, 2012-05-30
tab3: id, wdate, verkaufen, titel, beschreibung
Bsp.Einträge: 62, 2011-05-12, 1, Haus, Schönes Haus mit Garten
usw.
bisherige Lösungsversuche …
Soweit keine, nur fruchtlose Online-Recherchen
lg
Kalsan
Vielleicht ist diese Beschreibung besser:
Ich habe eine SQL Datenbank mit den Tabellen tab1, tab2 und tab3. Die Tabellen sind unterschiedlich, aber jede hat einen Eintrag wdate. Nun möchte ich eine Suchfunktion auf meiner Website machen, die in 2 dieser Tabellen in allen Spalten sucht.
Folgendes müsste der Befehl machen:
- LIKE benutzen, um % und _ zuzulassen
- In den Tabellen tab1 und tab3 sollen alle Spalten durchsucht werden
- Das gebündelte Resultat aus beiden Tabellen soll nach wdate sortiert sein
- In jeder Zeile des Resultats soll ein Feld sein, das dem Namen der Tabelle entspricht, damit man herausfinden kann, woher der Eintrag stammt.
Moin Kalsan,
so weit so gut, dein Problem ist FAST lösbar:
SELECT DISTINCT ‚TAB1‘ AS tabelle, colname
FROM tab1
WHERE char(upper(colname)) LIKE ‚%SUCHBEGRIFF%‘
UNION ALL
SELECT DISTINCT ‚TAB2‘ AS tabelle, colname
FROM tab2
WHERE char(upper(colname)) LIKE ‚%SUCHBEGRIFF%‘
ORDER BY wdate
sollte in etwa liefern was du haben willst.
Hier ist bereits das Gross-/Kleinschreibungsproblem behandelt plus das Problem mit dem Datentyp der zu durchsuchenden Spalte.
AAAAABER: mir ist keine Syntax bekannt, die alle Spalten einer Tabelle nach „Suchgegriff“ durchsuchen kann, nach WHERE muss ein spezifischer Spaltenname folgen.
Eine Lösung wäre vllt.
WHERE char(upper(colname1)) LIKE ‚%SUCHBEGRIFF%‘
OR char(upper(colname2)) LIKE ‚%SUCHBEGRIFF%‘
OR char(upper(colname3)) LIKE ‚%SUCHBEGRIFF%‘
…
ist viel Schreiberei, liefert aber das Ergebnis.
Gruss,
SomeOne
N’abend JeMand,
Vielen Dank für deine Antwort. Schade, dass ich die ganze Schreiberei auch machen muss, aber wenn’s da keine Lösung gibt, ist die von dir vorgeschlagene Zeile genau, was ich brauche.
lg
Kalsan
UNION vs. UNION ALL
Servus Kalsan,
ist leider wie ich geschrieben habe, alles geht auch mit SQL nicht …
Du musst bitte testen ob UNION ALL oder UNION das bessere Ergebnis liefert:
UNION ALL würde doppelte Werte anzeigen, wenn sie aus verschiedenen Tabellen stammen, UNION würde auch die noch unterdrücken.
Lass dich hier im Forum bitte bzgl. deines Tabellen-Entwurfes beraten, mir erscheint merkwürdig dass der Suchbegriff in diversen Tabellen vorkommen kann und auch dort in mehreren Feldern, ohne dass du aufgrund der Eingabe feststellen könntest, was gesucht wird und demnach in welcher Tabelle und in welchem Feld das zu stehen hat.
Mein Statement ist sozusagen eine Universal-Keule gegen einen schlechten Tabellenentwurf oder ein schlechtes Datenmodell .
Viel Erfolg,
SomeOne
Die Website ist in verschiedene Sektionen gegliedert: Forum, Kalender, Kauf-Verkauf,…
Die meisten Sektionen haben eine Tabelle für den Grundartikel, und eine Tabelle für die Antworten, die per ID-Referenz mit dem Grundartikel verknüpft sind.
Der Benutzer kann beim Suchen auswählen, welche Sektionen er durchsuchen möchte. Dann werden alle Felder der Haupttabelle und Antwortstabelle der Sektion durchsucht, sei es ob Titel, Text, Kommentar, Beschreibung, Tags oder was auch immer.
lg
Kalsan
Servus Kalsan,
bzgl. Webprogrammierung bin ich leider von jeglicher Sachkenntnis unbelastet , weiss nicht ob man das eleganter lösen könnte.
Datenbanktechnisch bleibt es bei dem Gesagten, du musst wohl alle Felder mit OR abfragen.
Viel Erfolg wünscht
SomeOne
Danke, werd ich wohl so machen, oder sogar für jede Sektion einzelne Anfragen machen.
lg
Kalsan