Avatar billede jaw Nybegynder
27. september 2005 - 21:03 Der er 22 kommentarer og
1 løsning

WHERE antal rækker > 1

Hej.

Som spørgsmålets titel:

Hvordan finder jeg resultater, hvor antallet af rækker med indholdet af et felt er større end 1.

Altså, et tabelstruktureksempel:
felt
a
a
b
a
c
c

Så vil jeg kun have listet rækkerne der indeholder a og c.
En GROUP BY-løsning vil ikke du'. Måske count, men kan ikke helt få den til at virke alligevel...
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:18 #1
SELECT felt,count(*) AS antal FROM dintabel GROUP BY felt HAVING count(*)>1

evt. ... HAVING antal>1
Avatar billede jaw Nybegynder
27. september 2005 - 21:22 #2
Tak Erik, men den giver desværre følgende:

Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:27 #3
Hvad er din sql-sætning?
Avatar billede jaw Nybegynder
27. september 2005 - 21:28 #4
SELECT playerid, datetime, COUNT(*) as antal FROM adminban HAVING COUNT(*) > 1 ORDER BY datetime, playerid ASC
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:29 #5
Jo, men du skal vel gøre som jeg skriver, med GROUP BY
Avatar billede jaw Nybegynder
27. september 2005 - 21:31 #6
Det duer jo ikke for mig, da jeg ikke skal have sorteret nogen rækker ud. Datetime-feltet kan jo godt være forskelligt, og indeholde data jeg vil bruge. Hvis jeg indsætter GROUP BY vil jeg kun få et datetime felt pr. playerid ?!
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:33 #7
Hvis datetime feltet er forskelligt for samme værdi af det felt du skal lave GROUP BY på, så har du da et problem af betydning: hvilken af de forskellige værdier skal den så vise?
Avatar billede jaw Nybegynder
27. september 2005 - 21:35 #8
Den skal vise begge 2. Jeg vil blot ikke bruge hverken playerid, datetime eller noget andet felt, hvis ikke antallet af rækker med det samme playerid er mere end 1.
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:38 #9
Okay, det kan du så ikke klare med een "almindelig" sql-sætning. Understøtter din mysql sub-selects?
Avatar billede jaw Nybegynder
27. september 2005 - 21:40 #10
Ok, har også nu klaret det med en lidt snusket php-metode, som er ret irriterende.

Om databasen understytter subselects tror jeg, men jeg kan ikke engang lige huske hvordan man finder versionen. Det er noget med SELECT mysql_version() ?
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:44 #11
Jeg tror det bare er

  select version()

Du skal vist op på noget 4.1.x
Avatar billede jaw Nybegynder
27. september 2005 - 21:44 #12
Tæt på, bare version(). Det giver version 4.1.10-standard.
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:46 #13
Så skulle det nok ku' la' sig gi' sig

Et eksperiment med en tabel jeg har ved hånden

select * from navne where navn in (select navn from navne group by navn having count(*)>1)
Avatar billede jaw Nybegynder
27. september 2005 - 21:56 #14
Jo, det ser faktisk ud til ikke at være helt tosset.
Avatar billede erikjacobsen Ekspert
27. september 2005 - 21:57 #15
;) Du kan jo bruge det hvis du vil. Jeg samler ikke på point. Svar selv, accepter eget svar.
Avatar billede jaw Nybegynder
27. september 2005 - 22:00 #16
Jo tak, det virker fortrinligt, skulle bare lige have min join på også.

Jeg takker mange gange :)
Avatar billede jaw Nybegynder
27. september 2005 - 22:43 #17
Det førte så til, at jeg for første gang i min "karriere" fik kørt en database (en tabel) i sænk :|
Avatar billede erikjacobsen Ekspert
27. september 2005 - 22:47 #18
Hvordan det?
Avatar billede jaw Nybegynder
27. september 2005 - 22:50 #19
Ja, det ved jeg ærlig talt ikke helt. Men der har lige været 10 minutter hvor jeg intet har kunnet foretage mig, da min forespørgsel åbenbart har ligget og kørt. Ikke engang phpMyAdmin kunne vise tabellen.
Avatar billede jaw Nybegynder
27. september 2005 - 23:00 #20
Hvilket så egentlig var noget ævl, for hvis intet andet kan tilgå tabellen så er det jo klart at phpMyAdmin heller ikke kan... Men nu er den da oppe i omdrejninger igen.
Avatar billede jaw Nybegynder
27. september 2005 - 23:03 #21
Jeg ved godt det er en voldsom forespørgsel, og det fik jeg da også bekræftet, men burde følgende virkelig være _så_ voldsomt:

$q = mysql_query("select adminban.playerid, adminban.reason as abreason, adminlogold.player_id, adminlogold.reason as alreason from adminban left join adminlogold on (adminlogold.time = adminban.datetime) where playerid in (select playerid from adminban group by datetime having count(*)>1) order by adminban.datetime LIMIT 20");

?

Så snart jeg fjerne order by-delen er der ikke de store problemer. Tabellen indeholder ca. 15K rækker, så det er da en sjat.
Avatar billede erikjacobsen Ekspert
27. september 2005 - 23:05 #22
Det er ikke alverden, hvis du altså har sat indexer på passende felter.
Avatar billede jaw Nybegynder
27. september 2005 - 23:07 #23
Umiddelbart skulle der ikke være ens felter i de to tabeller på nær lige reason, som jeg kalder henholdsvis abreason og alreason. Det der også undrer mig er, at den tilsyneladende ikke timede-out efter de normale 30 sekunder, men åbenbart har fortsat.
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