Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Wyszukiwarka
Forum PHP.pl > Forum > Przedszkole
grzemach
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ć?
JoShiMa
Zaczęłabym od poprawienia struktury bazy, o tak to głupiego robota.
grzemach
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
Tuminure
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`
JoShiMa
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.