Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Wyszukiwarka
grzemach
post
Post #1





Grupa: Zarejestrowani
Postów: 121
Pomógł: 4
Dołączył: 9.06.2007
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Witam,
Zastanawiam się czy przez MySQL jestem w stanie coś takiego zrobić czy większą część pracy zrobić w PHP.

Mam tablicę o X-ilości. W tablicy tej znajdują się indeksy, np:
  1. 0:
  2. word: test
  3. type: 1
  4. amount: 41
  5. idList: 56,65,258,566,757,957,958,990,993,1008,1025,1327,1250,1251,1277,1418,1419,1420,1
    421,1429,1431,1435,1439,1440,1450,1451,1474,1478,1483,1504,1510,1511,1512,1523,15
    43,1544,1545,1557,1658,1728,1739
  6. 1:
  7. word: słowa
  8. type: 1
  9. amount: 7
  10. idList: 990,993


Mam tabelę o strukturze:
id (int), price (float), name (varchar) i pozostałe pola (varchar/text/int i wiele innych - łącznie ok 30). Ale całość tyczy się "ID"

normalny SQL jest taki:
  1. SELECT * FROM TABLE WHERE `name` LIKE '%test% order by `name` ASC'

Co prawda ciut bardziej udziwniony, bo jeszcze pobieranie obrazków itd - ale można do niego uprościć.

Są 3 sortowania:
Price ASC/DESC
Name ASC/DESC
None - w ogóle brak szyfrowania

Teraz jest jednak "drobna" zmiana i powinno być sortowanie domyślne za pomocą:
'Ilość wystąpień danego ID' DESC

Czyli przykładowo:
990,993 (bo oba są 2x i dalej: ),56,65,258

Rozważam aby zrobić coś takiego za pomocą PHP, coś na zasadzie:
- tworzę tablicę z ID, sortowaną po ilości wystąpień
- wybieram odpowiednie ID (limit zamiast w mysql będzie w php)
- sortuję wg kolejności z tablicy
- zwracam

Czy jednak coś takiego jesteśmy w stanie zrobić za pomocą MySQL? Będzie to w miarę szybko działać?


--------------------
Go to the top of the page
+Quote Post
JoShiMa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


Zaczęłabym od poprawienia struktury bazy, o tak to głupiego robota.


--------------------
Go to the top of the page
+Quote Post
grzemach
post
Post #3





Grupa: Zarejestrowani
Postów: 121
Pomógł: 4
Dołączył: 9.06.2007
Skąd: Kielce

Ostrzeżenie: (0%)
-----


co byś zaproponował?
ewentualnie który artykuł polecasz do poczytania. Bo jest ich wiele, i sporo z nich jest absolutnie nic nie warta smile.gif

Ten post edytował grzemach 30.06.2015, 22:33:56


--------------------
Go to the top of the page
+Quote Post
Tuminure
post
Post #4





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Twoja tabela powinna mieć listy identyfikatorów w osobnej tabeli.

Zachowując obecną strukturę, możesz to zliczyć w następujący sposób:
  1. SELECT *, (CASE WHEN LENGTH(`idList`) = 0 THEN 0 ELSE LENGTH(`idList`) - LENGTH(REPLACE (`idList`, ",", "")) + 1 END) AS amount FROM `tablename`


Lub jeżeli zawsze masz minimum jeden identyfikator to nieco prościej:
  1. SELECT *, LENGTH(`idList`) - LENGTH(REPLACE (`idList`, ",", "")) + 1 FROM `tablename`


Ten post edytował Tuminure 1.07.2015, 13:05:05
Go to the top of the page
+Quote Post
JoShiMa
post
Post #5





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


Przechowanie idList w formie ciągu liczb to najgorsza praktyka jaka mozna sobie wyobraszić. Potrzebujesz osobnej tabeli gdzie będziesz miał relację miedzy Twoim rekordem a tymi id (dla każdego id osobny rekord w tej tabeli). Wtedy w bazie jest porządek edycja jest banalna i Twój problem tez robi się banalny.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 13:07