2016-05-29 8 views
0

Es gibt eine Tabelle mit einer Spalte namens "info", mit Inhalt wie {"Twitter": 28, "Total": 28, "Facebook": 1}. Wenn ich sql schreibe, möchte ich testen, ob "Total" größer als 10 ist oder nicht. Kann mir jemand helfen, die Anfrage zu schreiben? (Tabellenname ist landslides_7d)mySQL-Tabelle mit {"Twitter": 28, "Total": 28, "Facebook": 1}

(das ist, was ich habe)

SELECT * FROM landslides_7d WHERE info.Total > 10; 

Dank.

+0

Was genau meinst du, wenn du sagst: Ich will testen? Möchten Sie eine * Liste * aller Zeilen, in denen die Summe insgesamt> 10 ist? Oder, wie viele Zeilen gibt es? Oder möchten Sie in einer Zeile einen "Wahr/Falsch" -Wert angeben, ob die Zeile diesem Kriterium entspricht? –

+0

Ich möchte eine Liste aller Zeilen, deren Summe> 10 ist. –

+0

Ihre Tabelle muss mindestens 2 Spalten haben. Extrahieren Sie die Daten über ein JSON-Tool oder einen API-Generator? –

Antwort

0

Sie speichern den JSON wahrscheinlich in einer einzelnen Blob- oder Stringspalte. Dies ist sehr ineffizient, da Sie keine Indizes verwenden können und die gesamte JSON-Struktur bei jeder Abfrage analysieren müssen. Ich bin nicht sicher, wie viel Flexibilität Sie benötigen, aber wenn die JSON-Attribute relativ fest sind, empfehle ich, ein Skript (Ruby, Python usw.) auf dem Tabelleninhalt auszuführen und "total" in einem traditionellen Spaltenformat zu speichern. Sie könnten beispielsweise eine neue Spalte "total" hinzufügen, die das Attribut total als INT enthält.

Ein Nebeneffekt der Verwendung eines Skripts besteht darin, dass Sie falsch formatiertes JSON abfangen können, was in einer einzelnen Abfrage nicht möglich ist.

Sie können auch die Spalte "total" mit einem Trigger (beim Aktualisieren/Einfügen von "info") beibehalten, indem Sie die JSON_EXTRACT-Funktion verwenden, auf die in der @ johannes-Antwort verwiesen wird.

+0

Wenn 'JSON_EXTRACT' verfügbar ist, sind Sie am wahrscheinlichsten auf MySQL 5.7. Dann können Sie anstelle eines manuellen Triggers eine generierte Spalte verwenden, die weniger Speicherplatz benötigt (nur der Index wird gespeichert) und zuverlässig ist (die Datenbank versteht den Zweck). http://mysqlserverteam.com/generated-columns-in-mysql- 5-7-5 / – johannes

1

Das Datenformat scheint JSON zu sein. Wenn Sie MySQL 5.7 haben, können Sie JSON_EXTRACT oder die Kurzform -> verwenden. Diese Funktionen existieren in älteren Versionen nicht.

SELECT * FROM landslides_7d WHERE JSON_EXTRACT(info, '$.total') > 10; 

oder

SELECT * FROM landslides_7d WHERE info->total > 10; 

Siehe http://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-extract

daran, dass dies ein Full Table Scan ist. Auf einer "größeren" Tabelle möchten Sie einen Index erstellen.

Wenn Sie eine ältere Version von MySQL verwenden, sollten Sie eine zusätzliche Spalte für Ihre Tabelle erstellen und manuell den Gesamtwert zu dieser Spalte hinzufügen.

Verwandte Themen