Concat: Nach verbundenen String über zwei Spalten suchen

Guten Abend,

ich habe eine SQL Tabelle mit 4 Spalten, die ich auslese. Die Tabelle an sich hat mehr Spalten.
Aus diesen 4 Werten je Abfrage erzeuge ich Verweise. Aus speziellen Gründen, werden 2 der Werte (Wert 3 und 4) für die Ausgabe der Links verbunden. Leerzeichen in Wert 3 und 4 werden durch einen Bindestrich ersetzt. Die Verbindung zwischen Wert 3 und 4 wird ebenfalls durch einen Bindestrich erzeugt. Es ist zu beachten: Wert 3 und Wert 4 sind wie eine Art Text, es ist nicht vorhersehbar, wie viele Leerzeichen Wert 3 und Wert 4 haben! Deshalb hab ich keinen eindeutigen Indikator, an dem ich den String im nachhinein wieder trennen kann.

Beispiel:
http://url.tld/Wert1/Wert2/Wert3-Wert4
-> http://url.tld/Wert1/Wert2/Wasser-kann-fließen
-> http://url.tld/Wert1/Wert2/Wasser-kann-nicht-fliegen
-> http://url.tld/Wert1/Wert2/Wasser-ist-nicht-immer-flüssig

Also die Zahl der Leerzeichen kann sich ändern, mal ist Wert 3 länger, mal ist es Wert 4. Oben ist nur beispielhaft, ich mache keine Wassertabelle.

Ich weiß, dass ich durch CONCAT bei der Ausgabe zwei Spalten als eine Variable speichern kann. Wie ist das aber, wenn ich 2 Spalten habe, die eigentlich zusammengesetzt werden müssten, um den Datensatz eindeutig zu identifizieren bei einer Abfrage?

Im Prinzip nach dem Schema: "SELECT * FROM Database WHERE Spalte3+Spalte4 = '". $_GET['W3'] . $_GET['W3'] ."'"

Bindestriche natürlich mit str_replace vorher zurückwandeln + andere Denkschritte.

Ich hoffe ihr wisst was ich meine und könnt mir eventuell einen guten Link da lassen?

mfg

  1. Ich weiß, dass ich durch CONCAT bei der Ausgabe zwei Spalten als eine Variable speichern kann. Wie ist das aber, wenn ich 2 Spalten habe, die eigentlich zusammengesetzt werden müssten, um den Datensatz eindeutig zu identifizieren bei einer Abfrage?

    Ja, dann kannst Du die Variable auch in der where-clausel benutzen:

    SELECT CONCAT(user, host) AS aFROMuser WHERE CONCAT(user, host)="ticketlocalhost"

    +-----------------+
    | a               |
    +-----------------+
    | ticketlocalhost |
    +-----------------+
    1 row in set (0.00 sec)

    Aber: Das wird jedes mal zu einem Vollscan führen, das bedeutet Indizes sind nicht nutzbar, die Abfrage wird, wenn die Datenbank größer wird (oder ist) möglicherweise sehr lange dauern.

    Besser wäre es demnach die Daten in einer Spalte auch zu zusammenzufügen, zu indizieren und die WHERE-Clausel auf diese Spalte zu beziehen.

    Jörg Reinholz

    1. Ja, dann kannst Du die Variable auch in der where-clausel benutzen:

      Sigmund Freud hat sich im Hintergrund köstlich amüsiert. Es wäre schön, wenn das gänge. Wie mein Beispiel auch zeigte kann man die Variable gerade nicht verwenden. Aber die Funktion.

      Das hier geht also NICHT:

      SELECT CONCAT(user, host) AS aFROMuserWHEREa="ticketlocalhost"

      Jörg Reinholz

      1. Hallo Jörg,

        ich hab mir schon gedacht, dass das ziemlich lange dauert. Vll. ist es wirklich das Beste, das ganze direkt in einer Spalte zu verkünpfen, seperat, da die Daten an sich von der Bedeutung her eine andere haben, gleichzeitig aber zusammen gehören.

        Mal schauen wie es bei den > 50000 Datensätzen und 50 Spalten klappt...

        Vielen Dank für Deine Hilfe!

        mfg

        1. Mahlzeit,

          Mal schauen wie es bei den > 50000 Datensätzen und 50 Spalten klappt...

          Bei 50000 Datensätzen lächelt die Datenbank idR nur, wenn du sie nicht auf nem 386er laufen lässt.
          Aber bei 50 Spalten solltest du mal über ne Normalisierung nachdenken.

          --
          42