Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zaznacz wszystko, gdzie pole zawiera ciąg oddzielony przecinkiem

W MySQL możesz użyć FIND_IN_SET() :

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;

http://dev.mysql .com/doc/refman/5.0/en/string-functions.html#function_find-in-set

Pamiętaj, że FIND_IN_SET oczekuje, że ciągi będą przecinkiem rozdzielone, a nie przecinek i spacja rozdzielony. Więc możesz mieć problemy z ostatnim tagiem. Naprawdę najlepszym sposobem byłoby znormalizowanie tabeli; w przeciwnym razie możesz usunąć spacje z tags kolumna; wreszcie możesz obejść ten problem, dodając spację do tags kolumna:

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;

Jeśli liczba tagów jest ograniczona, możesz rozważyć przekonwertowanie kolumny na SET . To znacznie poprawi wydajność.

AKTUALIZUJ

Tyle że spacje źle . Są przed ciągi, a nie po.

A więc:

SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;

Ale znowu, pozbądź się tych spacji - to same kłopoty :-)

AKTUALIZACJA 2

Powyższe działa, dobrze. Ale to prawie wszystko, co możesz powiedzieć na moją korzyść. Nie tylko rozwiązanie jest dość *nie*wydajne, ale także sprawia, że ​​system jest nie do utrzymania (byłem tam, robiłem to, mam T-shirt i przeżuty tyłek pod tym samym). Więc teraz będę opowiadał się trochę za normalizacją, czyli posiadaniem przynajmniej tych dwóch dodatkowych tabel:

CREATE TABLE tags ( id      INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
                    tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );

O ile to jest lepsze? Pozwól mi policzyć sposoby.

  • możesz łatwo dodać bardziej elastyczne zapytania („ma wszystkie tagi w iOS, C++, ...” lub „ma co najmniej trzy tagi spośród tych:( iOS, Python, SQL, .NET, Haskell )”). Tak, możesz to zrobić za pomocą FIND_IN_SET , ale uwierz mi, nie spodoba ci się .
  • masz słownik kontrolowany tagów, co umożliwia sprawdzenie, czy jakiś tag jest znany (a także łatwe generowanie list, takich jak rozwijane pola kombi, lub -- czy ktoś powiedział „Autouzupełnianie jQuery”?).
  • zapisuje część nieruchomości na dysku (tagi są zapisywane raz)
  • wyszukiwania są szybkie . Jeśli znasz już tagi, których szukasz i wstępnie skompilujesz je w identyfikatory tagów, podczas działania pozostawią one na chodniku gumowe ślady SQL (wyszukiwanie zindeksowane dla liczby całkowitej wartość!). A tagów, które się nie skompilują nie będzie , a dowiesz się o tym jeszcze przed rozpoczęciem wyszukiwania.
  • ułatwia zmianę nazw tagów
  • może przechowywać dowolny numer tagów (ryzykujesz, że niektóre tagi zostaną skrócone do „iOS Developm” prędzej czy później...)

Uważam, że „pole CSV” jest cenione (lub) wśród Antywzorców SQL ( http://pragprog.com/book/bksqla/sql-antipatterns ) i nie bez powodu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Demon MySQL odmawia startu z Can't start server:Bind na porcie TCP/IP:Adres jest już używany (nie jest).

  2. Rozwiązywanie problemu awarii łącza komunikacyjnego za pomocą JDBC i MySQL

  3. Jak uzyskać dostęp do elementów tablicy

  4. Kreator Entity Framework ulega awarii w MySQL

  5. Znajdź podobne obrazy w (czystym) PHP / MySQL