2009-07-24 4 views
3

Ich habe ein Feld in einer Tabelle recipes, die mit mysql_real_escape_string eingefügt wurde, möchte ich die Anzahl der Zeilenumbrüche in diesem Feld zählen und die Datensätze mit dieser Nummer bestellen.Zählen Zeilenumbrüche in einem Feld und Reihenfolge von

p.s. Das Feld heißt Zutaten.

Vielen Dank allen

+0

Wenn Sie Schreibzugriff auf dieselbe Datenbank haben, können Sie eine temporäre Tabelle erstellen, um die Anzahl der Zeilenumbrüche für jeden Datensatz und jede Schleife in einer gespeicherten Prozedur oder den PHP-Code selbst zu speichern. die Tabelle würde nur eine Spalte für die Datensatz-ID enthalten, und Sie werden in den Inhalt dieser Tabelle Schleife und scannen alle \ n in Frage, und bei jedem Treffer Sie einen weiteren Eintrag einfügen müssen Sie dann ein schreiben Abfrage wie diese Wählen Sie Anzahl (1), Record_id von Temp_Table-Gruppe von Record_ID; Ich denke, –

Antwort

5

Dies würde es tun:

SELECT *, LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', '')) as Count 
FROM Recipes 
ORDER BY Count DESC 

Die Art, wie ich die Menge von Zeilenumbrüchen bin immer ein bisschen wie ein Hack ist, aber, und ich glaube nicht, dass es einen Weg gibt, besser . Ich würde empfehlen, eine Spalte mit Zeilenumbrüchen zu behalten, wenn die Leistung ein großes Problem darstellt. Für mittelgroße Datenmengen sollte das oben genannte jedoch in Ordnung sein.

Wenn Sie einen Cache-Spalte, wie oben beschrieben haben wollten, würden Sie tun:

UPDATE 
    Recipes 
SET 
    IngredientAmount = LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', '')) 

Danach, wann immer Sie aktualisieren/eine neue Zeile einzufügen, könnten Sie die Beträge berechnen (wahrscheinlich mit PHP) und füllen Sie diese Spalte vorher aus. Oder, wenn Sie in dieser Art von Sache sind, versuchen Sie triggers.

+0

Ich fürchte, das entspricht nicht den Anforderungen - Sie bestellen nur nach der Länge der Zeichenfolge, nicht die Anzahl der Zeilenumbrüche. – edoloughlin

+2

Schaust du wirklich, was die Abfrage tut? :) Count ist der Unterschied zwischen der Länge der Zeichenfolge und der Länge der Zeichenfolge ohne Zeilenumbrüche. Also, wenn ich die Zeichenfolge "abc \ ndef" habe, die eine Länge von 7 hat, und ich subtrahiere sie von abcdef (was REPLACE ('abc \ ndef', '\ n', '') mir geben würde) hat die Zeichenfolge eine Länge von 6, also der Unterschied ist 1, das ist die Anzahl der Zeilenumbrüche in der Zeichenfolge ... das funktioniert und wird getestet. –

+0

Danke, das hat Spaß gemacht! Wie würde ich den resultierenden COUNT aus einem Feld in den resultierenden Zeilen wiedergeben? – bluedaniel

0

Sie gehen hier ein wenig über die Fähigkeiten und Absichten von SQL hinaus. Sie könnten eine gespeicherte Prozedur schreiben, um die Zeichenfolge zu scannen und die Nummer zurückzugeben und diese dann in Ihrer Abfrage zu verwenden.

Ich denke jedoch, dass Sie das Design von was auch immer die Zutaten einfügen sollten, so dass Sie vermeiden, Strings in jeder Zeile zu suchen, wenn Sie diese Abfrage durchführen. Fügen Sie eine Spalte "num_linebreaks" hinzu, berechnen Sie die Anzahl der Zeilenumbrüche und legen Sie diese Spalte fest, wenn Sie die Indregreents hinzufügen.

Wenn Sie keine Kontrolle über die App haben, die das Einfügen durchführt, können Sie eine gespeicherte Prozedur verwenden, um num_linebreak basierend auf einem Trigger zu aktualisieren.

+0

Ist dies eine aufdringliche Speicherabfrage? – bluedaniel

+0

Ja. Denken Sie nur darüber nach, wie es ausgeführt werden würde. Sie scannen einen String in jeder Zeile, möglicherweise für jedes Mal, wenn Sie die Tabelle abfragen (ich weiß nicht, wie oder ob MySQL die Ergebnisse von String-Funktionen optimiert). – edoloughlin

+0

Wie würde eine PHP-Funktion so aussehen? Ich weiß, wo alle Auslöser sind. – bluedaniel

0

Verstanden Dank, sieht der PHP-Code wie:

$check = explode("\r\n", $_POST['ingredients']); 
$lines = count($check); 

So, wie ich in der Tabelle alle Daten aktualisieren konnte so Ingred_count in einem Kerl swoop für frühere Aufzeichnungen auf dem Feld Zutaten basieren?

2

Ich nehme hier viel an, aber von dem, was ich in Ihrem Beitrag lese, könnten Sie Ihre Datenbankstruktur ein wenig ändern, und beide lösen dieses Problem und öffnen Ihren Datensatz für interessantere Zwecke.

Wenn Sie Zutaten in eine eigene Tabelle aufteilen und eine Verknüpfungstabelle verwenden, um zu indexieren, welche Zutaten in welchen Rezepten vorkommen, ist es viel einfacher, mit Datenmanipulation kreativ zu sein. Es wird einfacher, die Zutaten pro Rezept zu zählen, Ähnlichkeiten in den Rezepten zu finden, nach Rezepten zu suchen, die Zutaten enthalten usw. Auch Ihre Daten wären normalisierter und kleiner. (Speichern einer globalen Liste aller Zutaten vs. Speichern eines Satzes für jedes Rezept)

Wenn Sie jetzt ein einzelnes Texteingabefeld verwenden, um Zutaten für ein Rezept einzugeben, können Sie die Eingabe zeilenweise aufteilen und verwenden Sie jede Zeile als Bestandteil beim Speichern in der Datenbank. Sie können etwas wie die integrierten Funktionen levenshtein() oder similar_text() von PHP verwenden, um mit falsch geschriebenen Zutatennamen umzugehen und die Daten so normalisiert wie möglich zu halten, ohne den Dateneintrag von [Benutzern] zu viel zu pflegen.

Dies ist nur ein Vorschlag, nehmen Sie es wie Sie möchten.

+0

ja ich verstehe das und ich habe mit diesem eine Weile gerungen, das Problem ist die große Vielfalt der Zutaten, die sie eingeben konnten, nicht nur Tomate aber Sonne errötete Tomate usw., sowie die Quantität. Vielleicht muss der Prozess in naher Zukunft normalisiert und rationalisiert werden, aber für den Moment funktioniert es. Ich möchte, dass es immer noch sehr offen und natürlich Prozess ist, wenn es um die Dateneingabe geht und nicht wollen, dass Menschen wie einige andere Websites eingeschränkt fühlen fühlen, ich denke, ich kann die Daten mit genügend PHP bearbeiten – bluedaniel

+0

Es ist eigentlich die Menge Aspekt, dass ich würde am meisten mit – bluedaniel

+0

kämpfen oh, jetzt verstehe ich, was Sie mit der Menge meinen. Es gibt ein paar Möglichkeiten, um das zu erreichen, und ich bin kein Datenbank-Master, aber es scheint mir, Sie könnten nur eine Menge Spalte in Ihrer Verknüpfungstabelle haben. Spalte 1 ist Inhaltsstoff-ID, Spalte 2 ist Rezept-ID, Spalte 3 ist Menge. – glomad

Verwandte Themen