Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Złożone zapytanie z obliczeniami
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam takie pytanko, mam 2 tabele:
  1. CREATE TABLE IF NOT EXISTS `test` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `user` bigint(20) DEFAULT NULL,
  4. `p1` smallint(1) DEFAULT NULL,
  5. `p2` smallint(1) DEFAULT NULL,
  6. `p3` smallint(1) DEFAULT NULL,
  7. `p4` smallint(1) DEFAULT NULL,
  8. `p5` smallint(1) DEFAULT NULL,
  9. `p6` smallint(1) DEFAULT NULL,
  10. `p7` smallint(1) DEFAULT NULL,
  11. `p8` smallint(1) DEFAULT NULL,
  12. `p9` smallint(1) DEFAULT NULL,
  13. `p10` smallint(1) DEFAULT NULL,
  14. UNIQUE KEY `gt_id` (`id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  16.  
  17. CREATE TABLE IF NOT EXISTS `loginy` (
  18. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  19. `login` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  20. UNIQUE KEY `gt_id` (`gt_id`)
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;


w tabeli test pola oznaczają:
- user = loginy.id
- p1-p10= liczba od 1 do 10 (ocena)

Mam skrypt który ma w $_SESSION['dane'] - id usera (przykładowo).

Chce generalnie wyświetlić listę użytkowników wraz z informacją (procentową) jak bardzo podobną do mojej odpowiedź zaznaczyli...

SELECT * FROM test WHERE user = '$_SESSION['dane']' - zwróci mi informację o moich odpowiedziach....

Teraz chciałbym poznać odpowiedzi innych w formie
- login_uzytkownika | ocena_procentowa
- login_uzytkownika | ocena_procentowa
- login_uzytkownika | ocena_procentowa
...

w tabeli z testami są oceny wielu użytkowników. każdy użytkownik może mieć nieskończenie wiele ocen od innych użytkowników.
Ocenę chce uzyskać w formie procentowej, czyli:
- pobrane z bazy moje odpowiedzi = 100%
- szukamy w bazie ocen dla innych użytkowników i porównujemy ich z moją oceną - i wyświetlamy w % podobieństwo...

hmm... jak by to porównać... Załóżmy że wypełniam formularz zgłoszeniowy do biura pracy i na podstawie tych danych szukamy ludzi którzy
zaznaczyli odpowiedzi podobne do moich... nie wiem czy dość dobrze to zobrazowałem....

Wiecie może jak to zrobić?


Z góry dziękuje za pomoc,
Northwest
AlexDeLarge
  1. SELECT loginy.login,
  2. ((ABS(test.p1 - $prawidlowaOdpowiedz1) / $maximumPunktowZaPytanie1) * 100) AS pkt1,
  3. ((ABS(test.p2 - $prawidlowaOdpowiedz2) / $maximumPunktowZaPytanie2) * 100) AS pkt2,
  4. ((ABS(test.p3 - $prawidlowaOdpowiedz3) / $maximumPunktowZaPytanie3) * 100) AS pkt3,
  5. ((ABS(test.p4 - $prawidlowaOdpowiedz4) / $maximumPunktowZaPytanie4) * 100) AS pkt4,
  6. ((ABS(test.p5 - $prawidlowaOdpowiedz5) / $maximumPunktowZaPytanie5) * 100) AS pkt5,
  7. ((ABS(test.p6 - $prawidlowaOdpowiedz6) / $maximumPunktowZaPytanie6) * 100) AS pkt6,
  8. ((ABS(test.p7 - $prawidlowaOdpowiedz7) / $maximumPunktowZaPytanie7) * 100) AS pkt7,
  9. ((ABS(test.p8 - $prawidlowaOdpowiedz8) / $maximumPunktowZaPytanie8) * 100) AS pkt8,
  10. ((ABS(test.p9 - $prawidlowaOdpowiedz9) / $maximumPunktowZaPytanie9) * 100) AS pkt9,
  11. ((ABS(test.p10 - $prawidlowaOdpowiedz10) / $maximumPunktowZaPytanie10) * 100) AS pkt10
  12. FROM test JOIN loginy ON test.user=loginy.id
Valdi_B
Proponuję pewne rozwinięcie powyższej kwerendy:

Sama powyższa kwerenda daje wykaz różnic oddzielnie "po poszczególnych pytaniach", co ciężko ocenić "na oko".
Warto by mieć jakiś jeden syntetyczny wskaźnik, np. sumę różnic w zakresie poszczególnych odpowiedzi.

Można zrobić coś takiego:
  1. SELECT login, pkt1+pkt2+pkt3+pkt4+pkt5+pkt6+pkt7+pkt8+pkt9+pkt10 AS sum_pkt
  2. FROM (...) AS p
  3. ORDER BY sum_pkt
Zamiast wielokropka do powyższej kwerendy trzeba wstawić kwerendę z poprzedniego postu.
Jest to więc w istocie kwerenda "ciągnąca" dane z kwerendy zagnieżdżonej.
Fragment "AS p" wynika stąd, że MySQL w przypadku zagnieżdżonych kwerend wymaga nadania im synonimu.
Dzięki sortowi na sumę różnic mamy "najlepiej pasujących" na początku.

Takie rozwiązanie jest bliższe postulowanemu formatowi "login_uzytkownika | ocena_procentowa" (jedna).

Inny wariant: Zamiast zwykłej sumy można ew. liczyć sumę kwadratów różnic (stosownie modyfikując powyższą kwerendę).
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.