Avatar billede aggemamme Nybegynder
25. september 2003 - 15:57 Der er 10 kommentarer og
1 løsning

Problemer med subqueries

Hej

Jeg har en tabel der indeholder en mængde brugeres svar på nogle spørgsmål. Brugerne kan vælge flere end et svar, og der kan således være flere svar pr. bruger.

Jeg ville lave et query, der tæller antallet af folk der har valgt svaret "1", og som OGSÅ har indsendt svaret "3".

Jeg har følgende query som jeg kalder <q>

      SELECT `users`.`id`
        FROM `users`,`answers`
        WHERE `answers`.`user` = `users`.`id`
        AND `answers`.`answer` = \'3\'
      );

som returnerer 90 rækker (hvor svaret på et stillet spørgsmål var 3). Dette query virker som det skal.

Jeg har et andet query, som skulle finde det endelige antal af svar:

  SELECT COUNT(`id`) AS `num`
      FROM `answers`
      WHERE `answers`.`answer` = \'1\'
      AND `answers`.`user` = (
        <q>
      );
    ');

For overskuelighedens skyld har jeg her skrevet <q>, men i virkeligheden har jeg indsat det første query på <q>s plads. Med andre ord et query i et query (en subquery).

Men det virker ikke :)

You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT `users`.`id` FROM `users

Hvad kan der være galt? Skal jeg overhovedet bruge subqueries? Tænker jeg helt galt lige nu? :)
Avatar billede websmith Nybegynder
25. september 2003 - 15:59 #1
MAn kan ikke bruge sub queries før end version 4.1 af mysql, og jeg er ikke sikker på at det er implementeret ordentligt i den version endda
Avatar billede aggemamme Nybegynder
25. september 2003 - 16:00 #2
Øv-øv! Jeg troede det var fra version 4. Men kan man så hente det jeg ønsker på anden måde?
Avatar billede websmith Nybegynder
25. september 2003 - 16:06 #3
tænker ...
Avatar billede aggemamme Nybegynder
25. september 2003 - 16:20 #4
Det har jeg også prøvet ... men det hjalp ikke så meget! :)
Avatar billede websmith Nybegynder
25. september 2003 - 16:21 #5
Hvad med:

select count(m1.id) from answers m1,answers m2
where m2.id=m1.id and m2.answer='1' and m1.answer='3'
Avatar billede websmith Nybegynder
25. september 2003 - 16:27 #6
Det som jeg har gjort er at joine den samme tabel med sig selv, som om den var to tabeller :)
Avatar billede aggemamme Nybegynder
25. september 2003 - 16:31 #7
Smart, meget! Tak for hjælpen :)
Avatar billede arne_v Ekspert
25. september 2003 - 16:35 #8
det må vel være:

SELECT COUNT(*) AS num
FROM answers a1,answers a2
WHERE a1.user=a2.user AND a1.answer=3 AND a2.answer=1
Avatar billede websmith Nybegynder
26. september 2003 - 14:40 #9
Det har du måske ret i, men der er vel ikke nogen grund til at tælle alle felterne i recorden. Dog har du da ret i at jeg havde glemt

as num
Avatar billede arne_v Ekspert
26. september 2003 - 14:45 #10
as num er ligegyldig.

Pointen var at så vidt jeg kan se er id et felt i users tabellsn ikke i
answers.

Og jeg forstår ikke hvad du mener med "tælle alle felter" ?

Man tæller rækker.  Og forskellen på COUNT(*) og COUNT(felt) er at den
sidste ikke tager rækker hvor feltet er NULL med. Og den første er sommetider
hurtigere fordi den er nemmere at optimere.
Avatar billede jespere Nybegynder
15. april 2004 - 11:03 #11
Jeg tror du skal lave den som:

SELECT COUNT(`id`) AS `num`
      FROM `answers`
      WHERE `answers`.`answer` = '1'
      AND `answers`.`user` IN (
        <q>
      );
    ');

Altså "IN" i stedet for "="
Når du har en subquery returnerer den en række poster. Feltet `answers`.`user` kan ikke være lig dem alle sammen. Men det kan være i blandt dem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester