Frage

Verschiedene Verkörperungen dieser Frage wurden, bevor hier gefragt, aber ich dachte, ich würde geben ihm einen weiteren Schuss.

Ich hatte ein schreckliches Datenbank-Layout. Eine einzelne Entität (Widget) wurde in zwei Tabellen aufgeteilt:

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment)

CREATE TABLE widget_data ( widget_id int(10), field ENUM('name','size','color','brand'), data TEXT)

Das war weniger als ideal. wenn gewünscht Widgets von einer bestimmten Namen, Farbe und Marke zu finden, musste ich auf dem widget_data Tisch ein Drei-Wege verbinden tun. so umgewandelt ich zum vernünftigen Tabellentyp:

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment, name VARCHAR(32),size INT(3),color VARCHAR(16), brand VARCHAR(32))

Das macht die meisten Abfragen viel besser. Aber es macht härter zu suchen. Früher war es so, dass, wenn ich wollte für Widgets suchen, sagen wir, ‚% schwarz%‘, würde ich nur SELECT * FROM widget_data WHERE data LIKE '%black%'. Das würde mich alle Instanzen von Widgets, die in der Farbe schwarz sind, oder von Blackwell Industrien gemacht, oder was auch immer. Ich würde sogar genau wissen, welches Feld angepasst, und das zu meinen Benutzer zeigen konnte.

Wie führe ich eine ähnliche Suche den neuen Tabellenlayout verwenden? Ich könnte natürlich tun WHERE name LIKE '%black%' OR size LIKE '%black%'... aber das scheint klobig, und ich weiß noch nicht, welche angepasst Felder aus. Ich könnte eine separate Abfrage für jede Spalte betreibe ich auf übereinstimmen soll, die mir alle Spiele geben würde, und wie sie angepasst, aber das wäre eine Performance Hit. irgendwelche Ideen?

War es hilfreich?

Lösung

Sie haben zwei widersprüchlichen Anforderungen. Sie suchen möchten, als ob alle Daten in einem einzigen Feld ist, aber Sie wollen auch, welche spezifischen Bereich zu identifizieren, wurde angepasst.

Es ist nichts falsch mit Ihrem WHERE name LIKE '%black%' OR size LIKE '%black%'... Ausdruck. Es ist eine absolut gültige Suche auf dem Tisch, wie Sie es definiert haben. Warum überprüft nicht nur die Ergebnisse in Code zu sehen, welche abgestimmt? Es ist ein minimaler Aufwand.

Wenn Sie eine sauberere Syntax für die SQL wollen, dann können Sie einen Blick auf die Tabelle erstellen, ein zusätzliches Feld hinzugefügt, die die anderen Felder verketten besteht:

CREATE VIEW extra_widget_data AS
  SELECT (name, size, color, brand,
          CONCAT(name, size, color, brand) as all_fields)
  FROM widget_data;

Dann würden Sie haben einen Index auf diesem Gebiet hinzuzufügen, die mehr Speicherplatz benötigt, CPU-Zeit usw. zu halten Ich glaube nicht, es lohnt sich.

Andere Tipps

Sie können einen Teil WHERE Ausdruck in Auswählen von Spalten enthalten. Zum Beispiel:

SELECT 
  *, 
  (name LIKE '%black%') AS name_matched,
  (size LIKE '%black%') AS size_matched
FROM widget_data 
WHERE name LIKE '%black%' OR size LIKE '%black%'...

Dann überprüft Wert von name_matched auf Seite des Skripts.

Nicht sicher, wie es die Leistung auswirken wird. Feal frei, es zu testen, bevor die Produktion gehen

Sie haben wahrscheinlich in MySQL Volltextsuche Fähigkeit aussehen wollen, dies ermöglicht es Ihnen, gegen mehrere Spalten von Varchar Typ entsprechen.

http://dev.mysql.com/doc /refman/5.1/en/fulltext-search.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top