Guten Tag,
ich bin gerade dabei mit PHP5 und MySQL5 eine Suche über eine größere Datenbank zu programmieren.
Mein erster Ansatz war folgender:
SELECT
feld1,
feld2
FROM
tabelle
WHERE
feld1 LIKE "%suchbegriff%"
OR
feld3 LIKE "%suchbegriff%"
Das funktioniert zwar, jedoch sehr langsam (bei vielen Feldern und großen Datenmengen). Macht ja auch Sinn, dass es nicht schnell ist.
Um es zu beschleunigen, habe ich einen FULLTEXT-Index über alle zu durchsuchenden Spalten angelegt und folgendermaßen gesucht:
SELECT
feld1,
feld2
WHERE
MATCH(feld1,feld3) AGAINST("suchbegriff*" IN BOOLEAN MODE)
Das ist nun deutlich schneller, allerdings findet er nur Prefixe und keine eingeschlossenen Wörter. Also: "mar" findet "Marketing" aber nicht "Wochenmarkt".
Ich bin nun also auf der Suche nach einer schnellen Methode, um Wörter und Teilwörter in den Datensätzen zu finden.
Hat einer von euch damit bereits Erfahrungen gemacht und kann mir weiterhelfen? Vielleicht kann man auch die erste Methode in irgend einer Form beschleunigen?
Ich habe den ganzen heutigen Tag damit verbracht Google durchzuwühlen und das MySQL-Handbuch zu lesen, habe jedoch keine brauchbare Lösung gefunden.
Vielen Dank!
Daniel
zeitgleich bin ich noch auf eine andere Lösung gestossen, fragt sich was schöner ist
(isnull (c1 ,0) + isnull(c2,0) + isnull(c3,0))
/(CASE
WHEN isnull(c1,0) <> 0 and isnull(c2,0) <> 0 and isnull(c3,0) <> 0 THEN 3
WHEN ((c1,0) <> 0 or isnull(c2,0) <> 0) or isnull(c3,0) <> 0 THEN 2
WHEN isnull(c1,0) <> 0 or isnull(c2,0) <> 0 or isnull(c3,0) <> 0 THEN 1
WHEN isnull(c1,0) = 0 and isnull(c2,0) = 0 and isnull(c3,0) = 0 THEN 0
Else -1 End as 'Average'
Ich verwende PostgreSQL mit C#! Nun will ich asyncron Query abfragen. Dabei sehe ich 2 möglichkeiten.
1. Die PostgreSQL funktion "ExecuteReader" jeweil in einem extra Thread aufrufen, aber ein gemeinsamen Verbindungsobject zur Datenbank verwenden.. denke das wäre evtl. fatal.
2. Für jede Query ein extra Verbindungsobject erzeigen und damit arbeiten??
Was meint ihr?
LOL! Die Seite www.addoit.com ist ja sehr informativ!
@Siassei! Schau dir mal SOCI http://soci.sourceforge.net/ an. Das ist zwar kein O/R-Mapper, macht aber die Verbindung von C++-Welt und SQL-Datenbanken sehr schön und einfach. Mir ist auch bisher kein echter O/R-Mapper für C++ bekannt.
@Daniel23b:
Du solltest immer dazuschreiben welches DBMS du verwendest, d.h. um welchen SQL Dialekt es geht. Nicht jeder weiss dass diese "Auto-Inkrement-Spalten" beim Microsoft SQL Server als "identity column" bezeichnet werden, und kann daher daraus folgern, dass es sich um T-SQL handelt.
Alles was du wissen willst sollte in der T-SQL Referenz (MSDN) zu finden sein.
Wenn es nur darum geht neue Daten einzufügen (und dabei die ID selbst zu bestimmen), dann kannst du einfach "SET IDENTITY_INSERT ON/OFF" verwenden.
Die Syntax ist immer die selbe, bloss wie bestimmte Dinge (z.B. Datum) formatiert werden unterscheidet sich je nach locale.
Und dann gibt's natürlich noch die "Collation", die bestimmte wie sortiert wird, und was als gleicher String gilt. z.B. ob bei String-Vergleichen Accents oder Gross-/Kleinschreibung berücksichtigt werden etc. Du musst aber bei Französisch nicht unbedingt eine andere Collation verwenden wie für Deutsch -- gleich wie bei der Locale kannst du dir aussuchen was du für die Datenbank verwenden möchtest. Bzw. kannst du das sogar auf Tabellen- oder Spalten-Ebene machen.
Unix-Tom schrieb:
http://www.connectionstrings.com/
...und von dort zitiert:
The delimiter can be specified in the registry at the following location:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Text
"Format" = "TabDelimited"
or
"Format" = "Delimited(;)"
Du kannst per ODBC auch ohne DSN auf jede beliebige Datenbank zugreifen.
Siehe: Connectionsting.
Welcher Connection-String für deine Datenbank benötigt wird, kannst du zum beispiel unter www.connectionstrings.com rausfinden.
Du musst dann halt statt SQLConnect() einfach SQLDriverConnect() verwenden.
Also ein Autowert ist ein Autowert wenn nichts anderen angegeben ist.
Hängt sehr vom RDBMS ab.
Bei MySQL kann man einen angeben und er nimmt in auch.
Bei MSSQL muss man vorher sagen das einer angegeben werden darf.
SQLLITE leider keien Ahnung da nie verwendet.
Kann es sein das du eine Wert in Identifier bereits drin hast.
Sollte dann zwar etwas von Duplicate entry oder so sagen aber kommt auch aufs RDBMS an.
Hallo, ichhabe Probleme mit eine Access-DB. DIe DB besteht aus 4 Tabellen, die nacheinander miteinander verknüpft sind (relational). Habe die Datenbank in C# eingebunden (als tytpisiertes DataSet). Nun habe ich das Problem, das ich bei dieser Anzahl von Tabellen Probleme mit dem abspeichern von Datensätzen habe. Die DB sieht folgendermaßen aus:
- Kundentabelle
- Zeichnungstabelle (ist über Kundennummer an Kundentabelle gebunden)
- Freigabetabelle (ist über Zeichnungsnummer an Zeichnungstabelle gebunden)
- Notitztabelle (ist über PA-Nr an Freigabetabelle gebunden)
Ich verwende für jede Tabelle in der Oberfläche einen Bindingnavigator, da z.B. ein Kunde mehrere ZEichnungen hat, usw. Die Navigation durch die einzelnen Tabellen, wenn ich zb. nach einem Kunde suche, funktioniert soweit. Probleme gibts aber, wenn ich Datensätze einfügen will.
Ist diese Vorgehensweise prinzipiell richtig, ode sind da solche Probleme vorprogrammiert? Hat jemand so ein ähnliches Projekt schon mal realisiert, der mir dabei helfen könnte?
SChau dir mal Join an. Da gibt es was für dich.
Stichwort: Alle Datensätze rechts die links nicht vorhanden sind.
Bitte Doku durchackern.
z.B. mal hier :
http://www.sql-und-xml.de/sql-tutorial/tabellen-verknuepfen-mit-join.html
oder
http://www.aspheute.com/artikel/20001023.htm
OUTER JOIN
Bevor du fragst was man wo verwendet solltest du dir mal ansehen was join, inner join, outer join etc. machen.
z.B. Nur die Datensätze aus der rechten wenn sie in der linken vorhanden sind etc.
Wie kommst du darauf das dies ein Multiselect ist?
Multiple selects (hab diesen Befriff noch nie gehört) sind subselects.
Du hast lediglich eine nicht dem standard entsprechende version von JOIN verwendet.
Funktionier IMHO nur in MYSQL. (Eben nicht Standard)
Hallo,
ich bin auf der Suche nach einem guten und kostenlosen XQuery Editor der auch mit Oracles Berkeley DB XML kompatibel ist.
Bin bis jetzt nur auf Shareware gestossen.
Viele Grüße
Chris