5 Stimmen

Suchanfrage, Priorität "Sortieren nach

Ich brauche eine einfache Suche in einer kleinen Inhaltstabelle: ID, Name, Beschreibung, Inhalt. Die Ergebnisse müssen nach Prioritäten geordnet sein

  1. Name
  2. Beschreibung
  3. Inhalt

wenn das gesuchte Wort im Beschreibungsfeld gefunden wurde, wird es erst nach allen Zeilen angezeigt, die einen Hund im Namensfeld haben

Was ich getan habe:

Ich habe versucht, eine temporäre Tabelle mit der gleichen Struktur wie die Tabelle zu erstellen, die ich verwende, aber mit einer anderen Feldpriorität. für jedes Feld, das ich für die Suche verwende, tun Auswahl einfügen zur temporären Tabelle

Beispiel:

  DECLARE @query NVARCHAR(255)

  CREATE TABLE #tbl_search
    (
      [id] INT NOT NULL ,
      [name] NVARCHAR(255) ,
      [description] NVARCHAR(MAX) ,
      [content] NVARCHAR(MAX) ,
      [priority] INT
    )    

    --searching in name field
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    1
            FROM    [tbl_content]
            WHERE   name LIKE '%' + @query + '%'

    --searching in description field            
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    2
            FROM    [tbl_content]
            WHERE   description LIKE '%' + @query + '%'
                    AND id NOT IN ( SELECT  id
                                    FROM    #tbl_search )
   --.....           

  SELECT    *
  FROM      #tbl_search
  ORDER BY  [priority]

  DROP TABLE #tbl_search

1 Stimmen

Ist da irgendwo eine Frage drin?

0 Stimmen

Ich schätze, er fragt, wie würdest du es machen

0 Stimmen

Am, ja du hast recht, das ist eine Frage :)

9voto

Amirshk Punkte 7964

Eine Möglichkeit dazu wäre die Verwendung der CASE Stichwort:

SELECT name, description, content,
    priority = CASE
        WHEN name LIKE '%' + @query + '%' THEN 1
        WHEN desription LIKE '%' + @query + '%'  THEN 2
        WHEN content LIKE '%' + @query + '%'  THEN 3
    END CASE
FROM tbl_content
WHERE
    name LIKE '%' + @query + '%' OR
    desription LIKE '%' + @query + '%'  OR
    content LIKE '%' + @query + '%'
ORDER BY priority ASC

0 Stimmen

Interessant, ich wusste nicht, dass ich die Möglichkeit habe, in Select zu suchen.

0 Stimmen

@msony, jetzt weißt du es :) CASE ist ein sehr leistungsfähiges Instrument

2voto

Alex Shirshov Punkte 635

Am einfachsten wäre es, eine UNION-Abfrage zu verwenden:

SELECT name AS text FROM tbl_content WHERE name LIKE '%' + @query + '%'
UNION
SELECT description AS text FROM tbl_content WHERE desription LIKE '%' + @query + '%'
UNION
SELECT content AS text FROM tbl_content WHERE content LIKE '%' + @query + '%'

0 Stimmen

@msony Ich glaube, Sie werden keine Duplikate erhalten, es sei denn, Sie verwenden UNION ALL.

1 Stimmen

Er wird Duplikate erhalten, da die Abfrage nur 1 Spalte enthält. @Alex, Sie müssen alle 3 Spalten zu jeder Abfrage hinzufügen (und die Bedingung so lassen, wie sie ist).

0voto

hpaknia Punkte 2521

Der Vollständigkeit halber verschiebe ich @Amirshk brillante Lösung auf die nächste Ebene, indem Sie den Fall, wenn in Reihenfolge Klausel (Abfrage für mysql):

SELECT name, description, content
FROM tbl_content
WHERE
    name LIKE '%' + @query + '%' OR
    desription LIKE '%' + @query + '%'  OR
    content LIKE '%' + @query + '%'
ORDER BY CASE
        WHEN name LIKE '%' + @query + '%' THEN 1
        WHEN desription LIKE '%' + @query + '%'  THEN 2
        WHEN content LIKE '%' + @query + '%'  THEN 3
    END

0 Stimmen

Worin besteht hier der effektive Unterschied?

0 Stimmen

Die ursprüngliche Lösung fügt eine Prioritätsspalte zu den Ergebnissen hinzu und ordnet die Ergebnisse nach Priorität. Obwohl die mysql-Bestellung akzeptiert CASE Erklärung. In meiner Antwort ist es nicht erforderlich, die Spalte "Priorität" hinzuzufügen. Die Reihenfolge des Ergebnisses ist dieselbe wie in der ursprünglichen Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X