Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Witajcie,

Mam sobie bazę mysql, w niej pola
id | nazwa | csv

i teraz dla przykładu

1 | test1 | 1;2;3;4;5;6;7;8;
2 | test2 | 4;5;2;1;6;

jest możliwość bezpośrednio w mysql wyszukiwać po polu csv:

pojedyńczą wartość np.: 1
wtedy zrobie LIKE "1"

ale gdybym chciał wyszukać np.

2,3,6 i aby wypisało mi wiersze zawierające owe liczby w kolumnie csv ?
Raczej nie chciałbym robić multizapytania typu:

....WHERE status=1 AND cos=2 AND csv LIKE 1 AND status=1 AND cos=2 AND csv LIKE 2...

gdyż docelowo tabela podczas wyszukiwania ma kilka zmiennych do porównania.

Z góry dzięki za pomoc, podpowiedź.

konto usunięte

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

To raczej nie ma sensu, bo nie masz zaindeksowanej struktury identyfikatorów w csv, nawet jakbyś założył na to full text to będzie wolniejsze. Przy takich danych użyj standardowej relacji 1:N, a nie kombinuj. W pgSQL, Oracle masz coś takiego jak typ tablicowy kolumny.. ale jak to sami twórcy piszą, ma to sens wtedy gdy interesuje cię kolejność pojawiania się nowych rekordów.

Jeżeli chcesz na wyjściu takie dane ( 1 wiersz z relacji 1:N ) to zerknij
na http://www.mysqlperformanceblog.com/2006/09/04/group_c...
Adam Bąk

Adam Bąk Programista

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Lub za pomocą trzeciej tabeli:

Np:
id|csv
1 | 1
1 | 2
1 | 3
...

Tak chyba lepiej ...

konto usunięte

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Adam Bąk:
Lub za pomocą trzeciej tabeli:

Np:
id|csv
1 | 1
1 | 2
1 | 3
...

Tak chyba lepiej ...

a jak zrobisz tą tabelę?
bo może się to wiązać z poważną przebudową całej aplikacji

swoją drogą kretyńskie rozwiązanie z tymi wartościami po przecinku, gratuluję pomysłu autorowi
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Czego tu gratulować. Przecież na ten "wspaniały" pomysł wpadają codziennie setki ludzi.

konto usunięte

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Michał Jarosz:
Czego tu gratulować. Przecież na ten "wspaniały" pomysł wpadają codziennie setki ludzi.

by później obudzić się z ręką w nocniku :>
Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Trzecia tabela była już analizowana jako alternatywa, poważnej przebudowy nie trzeba robić, bo dojdzie poprostu ładna relacja pomiędzy, tylko nie lubię strasznie dużej liczby wpisów, gdyż powiedzmy dla jednego obiektu dodamy 10 "csv id", a obiektów będzie 10000 =) Zna może ktoś inne rozwiązanie ?Grzegorz M. edytował(a) ten post dnia 04.11.10 o godzinie 00:06

konto usunięte

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

Grzegorz M.:
Trzecia tabela była już analizowana jako alternatywa, poważnej przebudowy nie trzeba robić, bo dojdzie poprostu ładna relacja pomiędzy, tylko nie lubię strasznie dużej liczby wpisów, gdyż powiedzmy dla jednego obiektu dodamy 10 "csv id", a obiektów będzie 10000 =)

dla bazy danych to bez znaczenia
a teraz się zastanów co ci się bardziej opłaci jedno pole powiedzmy na 200 bajtów razy 10^6 czy 20 * 10^6 rekordów o łącznej długosci ~24 bajtów
Zna może ktoś inne rozwiązanie ?Grzegorz M. edytował(a) ten post dnia 04.11.10 o godzinie 00:06

nie ma innego sensownego rozwiązania niż dodanie takiej tabeli

z mniej sensownych rozwiązań pozostaje tylko pętla i poszukiwanie elementów komórka po komurce
Grzegorz M.

Grzegorz M. www.avatec.pl

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

A wczoraj właśnie zapomniałem cały sens tego, i gdy pisałem skrypt jakoś tak mnie podkusiło i zacząłem robić wyszukiwanie w taki sposób:

SELECT * FROM tabela WHERE (dodatki LIKE '%1000%' OR dodatki LIKE '%1001%' ....

i uwaga, działa - nie wiem jak to się przełoży na obciążenia - ale śmiga dla prostych aplikacji bez problemu :-)

konto usunięte

Temat: MySQL wyszukiwanie wewnątrz pola zawierającego dane csv

jak już masz robić tego typu mykacze z like rób to w sposób cywilizowany

potrzeba dodatkową tabelkę filtr z polami pole i id

SELECT *
FROM tabela , filtry
WHERE dodatki LIKE filtry.pole and filtry.sid = '12345678980'

gdzie sid to id sesji, filtr dodajesz przed wykonaniem selecta

zaleta nie trzeba kleić zapytania z poziomu PHP, dodajesz tylko pola do tabeli filtr. działa to na zasadzie iloczynu kartezjańskiego z jednoczesnym filtrowaniem zbiorów

Następna dyskusja:

przeszukiwanie wg pola zawi...




Wyślij zaproszenie do