PHP, zagadka z indeksowaniem wyników

Witam, mam taki problem, mianowicie jest sobie pewien “program” który dodaje do bazy danych rekordy, jednym polem w tabeli są punkty, na swojej stronie wyświetlam te rekordy w kolejności od największego do najmniejszego według punktów, jednak program ten nie dodaje żadnego indeksowania do bazy. Indeksowanie zrobione jest na stronie głównej jako $i++ w pętli, no i teraz jest problem, ta strona to ranking, najwyższa ilość punktów jest z indeksem numer 1, zawsze tym indeksem równym jeden będzie rekord z najwyższą liczbą punktów po każdym załadowaniu strony. Zrobiłem do tego wyszukiwarkę gdyż tych wyników zapytania do bazy danych jest mnóstwo na stronie głównej, nikt nie będzie się szukał w tej stercie danych, tym bardziej że jak będzie podział na strony to nawet ręczne szukanie np poprzez ctrl+f nie wypali. W wyszukiwarce pokazane są te same dane, czyli liczba punktów, lecz bez przypisanego indeksu (pozycji w rankingu). No i tu rodzi się moje pytanie, jak to wszystko zrobić żeby te indeksy na bieżąco się aktualizowały z każdym nowym dodanym do bazy rekordem lub zmianą punktów w poszczególnych rekordach? Mam nadzieję że w miarę zrozumiałe przedstawiłem o co mi chodzi :slight_smile: Z góry dziękuję za pomoc.

nie napisałeś jaka baza, ale zakłada że MySql skoro apka stoi na php.

 

Stwórz widok dla twojej tabelki który będzie pozycję (przykład w fiddle poniżej):

http://sqlfiddle.com/#!2/ee1fe/4

 

i potem szukanie rób odpytując widok. 

Powinno zadziałać

Nie wiem czy to robi jakąś różnicę ale wyszukiwanie jest na oddzielnej stronie do której przekazywana jest tylko wartość metodą POST i na której to wyświetla sie tylko jeden wynik. Na stronie głównej wszystko fajnie działa ale gdy próbuję w jakiś sposób to zaimplementować na stronie szukania to albo nie ma w ogóle wartości albo jest równa 1, nie jestem w tym na tyle biegły żeby sobie jakoś poradzić. Zapytanie wyszukujące to

mysql_query("SELECT * FROM wszystko WHERE pozycja1 LIKE '%{$fraza}%' OR pozycja2 LIKE '%{$fraza}%'");
  1. Ty pisałeś tą stronę? Coś zaczynam mieć wątpliwości.

  2. Masz dostęp do bazy danych z możliwością tworzenia nowyych obiektów bazodanowych?

  3. Na jakim silniku masz bazę Mysql, Mssql, LiteSql, Postgresql?

  4. Wiesz co to jest View Table?

  5. Zrozumiałeś podpowiedź z podrzegniego postu?

1,Nie

2.Tak

3.MySQL

4.Widok tabeli

5.Nie bardzo, dziś sobie trochę poczytałem i lepiej to rozumiem dlatego czy mógłbym prosić o ten sam przykład jeszcze raz bo juz pod tym linkiem nic nie ma

 

Znalazłem podobny przykład, coś z nim może wymyślę i dojdę jak to zrobić

SELECT c.course_id, 
        @curRow := @curRow + 1 AS row_number
FROM course c
JOIN (SELECT @curRow := 0) r;

Tutaj masz post na którym wzorowałem się pisząc odpowiedź:

http://stackoverflow.com/questions/3126972/with-mysql-how-can-i-generate-a-column-containing-the-record-index-in-a-table

 

Tworząc view table z rankingiem utowrzysz tabelę która będzie trzymać wszystkie potrzebne ci informację.

 

Następnie będziesz odpytywał ten widok zamiast głównej tabeli i tak z bazy zostaną zwrócone ci rekordy z wyliczonymi pozycjami.

Jeszcze pytanie, czy widok trzeba zrobić z tym fragmentem?

@curRow := @curRow + 1 AS row_number

Bo jeśli tak to nie da się tego zrobić

Oki zgadza sie widok nie może zawierać zmiennej. Moja nie uwaga. 

 

Posiłkując się dalej SQLFiddle propronuje takie podzapytanie:

http://sqlfiddle.com/#!8/0e226

 

podzapytanie generuje ranking, a gówne zapytanie ma klauzulę where gdzie można podać warunki wyszukania.

 

Można to opakować w procedurę, albo wywołowyć taki selectem. Nie wiem jak masz zbudowaną warstwę dostępu do danych, więc dalszą część pozastawiam Tobie.

 

 

Wygląda ze sql fiddle coś się wiesza.

 

Schema:

CREATE TABLE supportContacts 
	(
     id int auto_increment primary key, 
     name varchar(20), 
     points int
    );

INSERT INTO supportContacts
(name, points)
VALUES
('Krzysztof', 7),
('Mariusz', 8),
('Mariusz1', 10),
('Mariusz2', 6),
('Mariusz3', 4),
('Mariusz4', 2),
('Mariusz5', 12),
('Mariusz6', 14),
('Mariusz7', 16),
('Mariusz8', 18),
('Krzysztof1', 1),
('Krzysztof2', 2),
('Krzysztof3', 5),
('Krzysztof4', 6),
('Krzysztof5', 13),
('Krzysztof6', 17);

Zapytanie:

select name, points, position from (

select sc.name, sc.points, @curRow := @curRow + 1 AS position
from supportContacts sc 
JOIN (SELECT @curRow := 0) r
order by sc.points desc) as sub

where name Like 'Mar%'

Dzięki wielkie! Wszystko super działa, jeszcze raz bardzo dziękuję i pozdrawiam :slight_smile: