Złożone zapytanie z obliczeniami w MySQL

0

Witam serdecznie,
Mam takie pytanko, mam 2 tabele:

 
CREATE TABLE IF NOT EXISTS `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user` bigint(20) DEFAULT NULL,
  `p1` smallint(1) DEFAULT NULL,
  `p2` smallint(1) DEFAULT NULL,
  `p3` smallint(1) DEFAULT NULL,
  `p4` smallint(1) DEFAULT NULL,
  `p5` smallint(1) DEFAULT NULL,
  `p6` smallint(1) DEFAULT NULL,
  `p7` smallint(1) DEFAULT NULL,
  `p8` smallint(1) DEFAULT NULL,
  `p9` smallint(1) DEFAULT NULL,
  `p10` smallint(1) DEFAULT NULL,
  UNIQUE KEY `gt_id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `loginy` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `login` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  UNIQUE KEY `gt_id` (`gt_id`)
) 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
    ...

Wiecie może jak to zrobić?

Z góry dziękuje za pomoc,
Northwest

0

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....

0

Nie zrozum mnie źle, ale do d**y masz tą strukturę.
Zakładając, że kolumny p1-p10 w Twojej tabeli test mają przechowywać oceny kolejnych pytań (tak?):

IMO tabela powinna wyglądać tak:

CREATE TABLE IF NOT EXISTS `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user` bigint(20) NOT NULL,
  `PytanieId` int(11) NOT NULL,  
  `Ocena` smallint(1) DEFAULT NULL,  
  UNIQUE KEY `gt_id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Wtedy zapytanie, o które pytasz:

select `L`.`login`, `T`.`PytanieId`, `T`.`Ocena` from `test` `T` 
inner join `loginy` `L` on `T`.`user` = `L`.`id`

edit: zacząłem pisać posta zanim dodałeś wyjaśnienie
BTW. Nie powinno to wylądować w Bazach Danych?

0

tzn mamy pola: p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 - to są odpowiedzi na pytania (najczęściej od 1 do 10, ale nie zawsze).

Jeden użytkownik może wypełnić tylko 1 test. Ale porównań ja -> inni użytkownicy może być nieskończenie wiele

Test jest wspólny dla wszystkich użytkowników...

chyba teraz lepiej to zobrazowałem 1 test i 10 pytań (p1-p10) - i patrzymy który odpowiedział najbardziej podobnie do mnie

0
SELECT 
  t2.id
FROM 
  test t1, 
  test t2
WHERE
  t1.id = 1
  AND t2.id <> 1
  AND Abs(t1.p1 - t2.p1) + 
      Abs(t1.p2 - t2.p2) + 
      Abs(t1.p3 - t2.p3) + 
      Abs(t1.p4 - t2.p4) + 
      Abs(t1.p5 - t2.p5) + 
      Abs(t1.p6 - t2.p6) + 
      Abs(t1.p7 - t2.p7) + 
      Abs(t1.p8 - t2.p8) + 
      Abs(t1.p9 - t2.p9) + 
      Abs(t1.p10- t2.p10) = 
    (SELECT Min(Abs(t1.p1 - t2.p1) + 
                Abs(t1.p2 - t2.p2) + 
                Abs(t1.p3 - t2.p3) + 
                Abs(t1.p4 - t2.p4) + 
                Abs(t1.p5 - t2.p5) + 
                Abs(t1.p6 - t2.p6) + 
                Abs(t1.p7 - t2.p7) + 
                Abs(t1.p8 - t2.p8) + 
                Abs(t1.p9 - t2.p9) + 
                Abs(t1.p10- t2.p10))
    FROM 
      test t1, 
      test t2
    WHERE
      t1.id = 1
      AND t2.id <> 1)

gdzie 1 to id usera, dla którego chcesz znaleźć najbardziej podobne. Nie jest to optymalne i wymaga przemielenia całej tabeli. Aby zyskać na szybkości mógłbyś sumy zapisywać do osobnej kolumny np. triggerem

1 użytkowników online, w tym zalogowanych: 0, gości: 1