|
| MySQL og Count giver altid værdien 1? Fra : Frank Sørensen |
Dato : 21-10-03 11:17 |
|
Hvorfor giver denne:
strSql = "select *, Count(titel) AS counted from varetabel where (titel LIKE
'%" & strKeyword &"%') group by titel order by titel limit -1"
Altid counted værdien "1"?
Mvh
Frank Sørensen
| |
Walther Jensen (21-10-2003)
| Kommentar Fra : Walther Jensen |
Dato : 21-10-03 12:19 |
|
Frank Sørensen wrote in dk.edb.internet.webdesign.serverside.asp:
> Hvorfor giver denne:
>
> strSql = "select *, Count(titel) AS counted from varetabel where (titel LIKE
> '%" & strKeyword &"%') group by titel order by titel limit -1"
>
> Altid counted værdien "1"?
>
Prøv og fjern limit -1..
The LIMIT clause can be used to constrain the number of rows returned by the
SELECT statement. LIMIT takes one or two numeric arguments, which must be
integer constants. With one argument, the value specifies the number of rows to
return from the beginning of the result set. With two arguments, the first
specifies the offset of the first row to return, the second specifies the
maximum number of rows to return. The offset of the initial row is 0 (not 1):
To be compatible with PostgreSQL MySQL also supports the syntax: LIMIT
row_count OFFSET offset.
> Mvh
> Frank Sørensen
>
>
--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Frank Sørensen (21-10-2003)
| Kommentar Fra : Frank Sørensen |
Dato : 21-10-03 12:33 |
|
> Prøv og fjern limit -1..
Den gør stadig det samme
Mvh
Frank Sørensen
| |
Jens Gyldenkærne Cla~ (21-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 21-10-03 12:50 |
|
Frank Sørensen skrev:
> strSql = "select *, Count(titel) AS counted from varetabel
> where (titel LIKE '%" & strKeyword &"%') group by titel order
> by titel limit -1"
Prøv med:
strSql = "select titel, Count(titel) AS counted from varetabel
where (titel LIKE '%" & strKeyword &"%') group by titel order
by titel limit -1"
Hvis du har flere felter end titel i din varetabel vil ovenstående
formentlig gruppere efter alle felterne (fordi du bruger select *).
MSSQL og Access vil i øvrigt give en fejl hvis man forsøger at
medtage ikke-aggregerede felter i selectlisten uden at have dem med
i group by-linjen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Frank Sørensen (21-10-2003)
| Kommentar Fra : Frank Sørensen |
Dato : 21-10-03 17:37 |
|
> strSql = "select titel, Count(titel) AS counted from varetabel
> where (titel LIKE '%" & strKeyword &"%') group by titel order
> by titel limit -1"
Stadig samme resultat.. Den skifter nu mellem værdierne 1 og 3
men det mærkelige er at det rigtige antal rækker vises men tælles åbenbart
ikke op?
| |
Jens Gyldenkærne Cla~ (21-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 21-10-03 21:38 |
|
Frank Sørensen skrev:
> Stadig samme resultat.. Den skifter nu mellem værdierne 1 og 3
> men det mærkelige er at det rigtige antal rækker vises men
> tælles åbenbart ikke op?
Hvordan "tælles op"? Prøv at skitsere hvad du gerne vil have
forespørgslen til at gøre - og hvad den gør.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Frank Sørensen (21-10-2003)
| Kommentar Fra : Frank Sørensen |
Dato : 21-10-03 21:48 |
|
> Hvordan "tælles op"? Prøv at skitsere hvad du gerne vil have
> forespørgslen til at gøre - og hvad den gør.
strSql = "select *, Count(titel) AS counted from varetabel where (titel LIKE
'%" & strKeyword &"%') group by titel order by titel limit -1"
Ovenstående skal finde alle titler hvori søgeordet strKeyword indgår og
samtidig tælle antal fundne poster.
Mvh
Frank Sørensen
| |
Jens Gyldenkærne Cla~ (21-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 21-10-03 22:13 |
|
Frank Sørensen skrev:
> strSql = "select *, Count(titel) AS counted from varetabel
> where (titel LIKE '%" & strKeyword &"%') group by titel order
> by titel limit -1"
>
> Ovenstående skal finde alle titler hvori søgeordet strKeyword
> indgår og samtidig tælle antal fundne poster.
Altså - du mener der skal tælles som følgende eksempel?:
strKeyword = "asp"
titel counted
"Beginning ASP" 1
"ASP 3.0" 2
"ASP.NET" 3
....
Det virker ikke med den forespørgsel du har givet. Lav optællingen
i asp - der er ikke nogen direkte metode til det i sql.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Frank Sørensen (22-10-2003)
| Kommentar Fra : Frank Sørensen |
Dato : 22-10-03 11:43 |
|
> Altså - du mener der skal tælles som følgende eksempel?:
>
> strKeyword = "asp"
>
> titel counted
> "Beginning ASP" 1
> "ASP 3.0" 2
> "ASP.NET" 3
Ja helt præcist
> Det virker ikke med den forespørgsel du har givet. Lav optællingen
> i asp - der er ikke nogen direkte metode til det i sql.
Jamen hvis jeg f.eks. laver en variabel "antal" og tæller den op med 1 hver
gang jeg kører igennem loopet af fundne poster, så kan jeg jo kun skrive
resultatet ud i bunden af siden...
Hvordan griber jeg det an hvis jeg gerne vil have antallet i toppen af
siden?
Mvh
Frank Sørensen
| |
Jørn Andersen (22-10-2003)
| Kommentar Fra : Jørn Andersen |
Dato : 22-10-03 12:05 |
|
On Wed, 22 Oct 2003 12:42:37 +0200, "Frank Sørensen"
<frank2@tdc*REMOVE*adsl.dk> wrote:
>> Altså - du mener der skal tælles som følgende eksempel?:
>>
>> strKeyword = "asp"
>>
>> titel counted
>> "Beginning ASP" 1
>> "ASP 3.0" 2
>> "ASP.NET" 3
>
>Ja helt præcist
>
>> Det virker ikke med den forespørgsel du har givet. Lav optællingen
>> i asp - der er ikke nogen direkte metode til det i sql.
>
>Jamen hvis jeg f.eks. laver en variabel "antal" og tæller den op med 1 hver
>gang jeg kører igennem loopet af fundne poster, så kan jeg jo kun skrive
>resultatet ud i bunden af siden...
>
>Hvordan griber jeg det an hvis jeg gerne vil have antallet i toppen af
>siden?
Aha, du vil altså *både* have det samlede antal *og* en "nummerering
ud for hver post?
Du har flere muligheder:
1. Løbe recordsettet igennem to gange
- ressource-mæssigt er det ikke specielt hensigtsmæssigt
2. Bruge objRs.getrows
- herved trækker du dit recordset over i et array. Du belaster
databasen minimalt, og du kan hoppe rundt i array'et efter behov.
Det samlede antal findes enkelt med Ubound(array) + 1.
3. Lave 2 forespørgsler - én til antal og én til udskriftsdata.
4. Lave en mere klar adskillelse mellem din databehandlings-del og din
udskriftsdel, så du trækker alle data ud, formattérer dem til udskrift
- og så først udskriver dem til sidst. Specielt hvis du skal gruppere
kan det give nogle fordele.
Ressourcemæssigt kan det laves både godt og skidt.
Hvilken løsning der er bedst for dig afhænger bl.a. af udtrækkets
størrelse og hvordan du foretrækker at kode.
Good luck!
--
Jørn Andersen,
Brønshøj
| |
Frank Sørensen (22-10-2003)
| Kommentar Fra : Frank Sørensen |
Dato : 22-10-03 12:45 |
|
For det første mange tak for dine forslag Jørn
>>> Det virker ikke med den forespørgsel du har givet. Lav optællingen
>>> i asp - der er ikke nogen direkte metode til det i sql.
Hvorfor virker det ikke med min forespørgsel? er det pga. brugen af LIKE?
> 3. Lave 2 forespørgsler - én til antal og én til udskriftsdata.
Jeg valgte ovenstående og det virker perfekt
Mvh
Frank Sørensen
| |
Jørn Andersen (22-10-2003)
| Kommentar Fra : Jørn Andersen |
Dato : 22-10-03 13:03 |
|
On Wed, 22 Oct 2003 13:45:02 +0200, "Frank Sørensen"
<frank2@tdc*REMOVE*adsl.dk> wrote:
>For det første mange tak for dine forslag Jørn
Velbekomme!
>>>> Det virker ikke med den forespørgsel du har givet. Lav optællingen
>>>> i asp - der er ikke nogen direkte metode til det i sql.
>
>Hvorfor virker det ikke med min forespørgsel? er det pga. brugen af LIKE?
Det ved jeg faktisk ikke, men for at finde ud af det ville jeg
eksperimentere med forespørgslerne i databasen. Hvis det fx er en MS
Access kommer man langt med forespørgselsgitteret (Query By Example)
Mit gæt er, at det er GROUP BY, der spiller ind.
>> 3. Lave 2 forespørgsler - én til antal og én til udskriftsdata.
>
>Jeg valgte ovenstående og det virker perfekt
Det er normalt også den enkleste metode, og der er heller ikke de
store ressource-problemer med den.
--
Jørn Andersen,
Brønshøj
| |
Jens Gyldenkærne Cla~ (22-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 22-10-03 13:52 |
|
Frank Sørensen skrev:
>>>> Det virker ikke med den forespørgsel du har givet. Lav
>>>> optællingen i asp - der er ikke nogen direkte metode til
>>>> det i sql.
>
> Hvorfor virker det ikke med min forespørgsel? er det pga.
> brugen af LIKE?
Nej - det er fordi COUNT ikke virker sådan som du tror den virker.
Der er ikke nogen "løbende sum"-funktion i SQL - når du bruger
COUNT tælles det antal rækker der er "gemt" bag en grupperet række
i et postsæt.
Eksempel:
tabel
felter: id, gruppe, navn, pris
data:
1, "ASP", "ASP-bogen", 349.00
2, "PHP", "PHP-bogen", 214.50
3, "ASP", "Alt om ASP.NET", 499.00
4, "ASP", "ASP 3.0", 356.00
5, "PHP", "PHP og databaser", 322.31
SELECT gruppe, COUNT(*) as counted FROM tabel =>
ASP, 3 (posterne 1, 3 og 5)
PHP, 2 (postenne 2 og 4)
Der er ikke nogen måde at tælle "nedad" i et postsæt.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Torben Brandt (22-10-2003)
| Kommentar Fra : Torben Brandt |
Dato : 22-10-03 22:26 |
|
Jens Gyldenkærne Clausen skrev:
> Der er ikke nogen måde at tælle "nedad" i et postsæt.
Der er ikke en funktion, der kan gøre det, men man kan godt konstruere
en forespørgsel, der returnerer en ekstra kolonne med fortløbende
nummerering af de returnerede poster.
Det er dog sjældent besværet værd...
mvh Torben
| |
Jakob Andersen (22-10-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 22-10-03 23:49 |
|
"Jørn Andersen" <jorn@jorna.dk> wrote
> Du har flere muligheder:
> 1. Løbe recordsettet igennem to gange
> ....
> 2. Bruge objRs.getrows
>
> 3. Lave 2 forespørgsler - én til antal og én til udskriftsdata.
> ....
> 4. Lave en mere klar adskillelse mellem din databehandlings-del og din
> ...
5. Åbn recordsettet med en _ikke_ Forward-only cursor og brug RecordCount
egenskaben. Dog er dette nok langsommere end f.eks. 3.
--
Jakob Andersen
| |
Jens Gyldenkærne Cla~ (23-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 23-10-03 12:38 |
|
Torben Brandt skrev:
> Der er ikke en funktion, der kan gøre det, men man kan godt
> konstruere en forespørgsel, der returnerer en ekstra kolonne
> med fortløbende nummerering af de returnerede poster.
Kan du vise et eksempel på det?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jakob Andersen (23-10-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 23-10-03 13:32 |
| | |
Torben Brandt (23-10-2003)
| Kommentar Fra : Torben Brandt |
Dato : 23-10-03 13:36 |
|
Jens Gyldenkærne Clausen skrev:
> Torben Brandt skrev:
>
>> Der er ikke en funktion, der kan gøre det, men man kan godt
>> konstruere en forespørgsel, der returnerer en ekstra kolonne
>> med fortløbende nummerering af de returnerede poster.
>
> Kan du vise et eksempel på det?
Lad os antage følgende setup:
Vi har en tabel (tabel) med 3 felter (id, tekst, tal). Vi ønsker tilføje
en kolonne med numrene 1,2,3,... til udtrækket: [sql1]
SELECT id, tekst, tal FROM tabel WHERE id BETWEEN 2 AND 7 ORDER BY tal
Først ignorerer vi WHERE-betingelsen og opbygger: [sql2]
SELECT tbl.id, tbl.tekst, tbl.tal, numre.nummer
FROM (
tabel AS tbl
LEFT JOIN
(
SELECT x.tal, COUNT(1) AS nummer
FROM tabel AS x, tabel AS y
WHERE x.tal >= y.tal GROUP BY x.tal
) AS numre
ON tbl.tal = numre.tal
)
ORDER BY tbl.tal
Den udskriver alle posterne i 'tabel' ordnet efter 'tal' og med en
ekstra kolonne 'nummer', der er 1 for posten med det mindste 'tal', 2
for den næste post, osv
Man kan nu kombinere de to udtræk: [sql3]
sql3 = replace(sql2, "tabel", "(" & sql1 & ")")
set rs = conn.execute(sql3)
Bemærk dog at værdierne i den kolonne man sorterer efter (tal) skal være
unikke. Jeg har heller ikke overvejet hvad der sker hvis man vil sortere
efter flere kriterier...
mvh Torben
| |
Jens Gyldenkærne Cla~ (23-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 23-10-03 13:58 |
| | |
Jakob Andersen (23-10-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 23-10-03 14:49 |
| | |
Jens Gyldenkærne Cla~ (23-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 23-10-03 14:11 |
|
Torben Brandt skrev:
> Den udskriver alle posterne i 'tabel' ordnet efter 'tal' og
> med en ekstra kolonne 'nummer', der er 1 for posten med det
> mindste 'tal', 2 for den næste post, osv
Smukt - men så vidt jeg kan gennemskue også tungt. Kørt på en lille
tabel (< 100 poster) kører det fint, men det tager et godt stykke
tid på en tabel med 6-7000 poster (jeg stoppede forespørgslen da
den ikke gav svar efter nogle sekunder).
(mine kørsler er foretaget på MSSQL 2000, med sortering på
primærnøglen og helt uden WHERE-klausuler).
Er Jakobs metode mere effektiv?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Torben Brandt (23-10-2003)
| Kommentar Fra : Torben Brandt |
Dato : 23-10-03 18:30 |
|
Jens Gyldenkærne Clausen skrev:
> Torben Brandt skrev:
>
>> Den udskriver alle posterne i 'tabel' ordnet efter 'tal' og
>> med en ekstra kolonne 'nummer', der er 1 for posten med det
>> mindste 'tal', 2 for den næste post, osv
>
> Smukt - men så vidt jeg kan gennemskue også tungt. Kørt på en lille
> tabel (< 100 poster) kører det fint, men det tager et godt stykke
> tid på en tabel med 6-7000 poster (jeg stoppede forespørgslen da
> den ikke gav svar efter nogle sekunder).
Ja, det er ikke en optimal metode, så i ASP-sammenhæng kan man med
fordel arbejde med en tælle-variabel uden for databasen.
Jeg kan se at min metode stort set svarer til nogle af eksemplerne som
Jakob linkede til hos microsoft. Tilsyneladende kan man spare min left
join og bruge en group by i stedet. Jeg tror dog ikke at det rykker
særlig meget.
> (mine kørsler er foretaget på MSSQL 2000, med sortering på
> primærnøglen og helt uden WHERE-klausuler).
Jeg har lige kigget lidt rundt på Google og til MSSQL ser man også
variationen med at oprette en midlertidig tabel med en primær nøgle
(IDENTITY(int,1,1)) og kopiere data deroveri. Så bliver den nye primære
nøgle jo også en nummer-kolonne.
Det virker heller ikke som den optimale løsning.
> Er Jakobs metode mere effektiv?
Det er den sikkert - jeg har ikke prøvet, da jeg slet ikke har MySQL
installeret for tiden. Mit eksempel er egentlig udviklet til Access...
/Torben
| |
Jens Gyldenkærne Cla~ (23-10-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 23-10-03 15:56 |
| | |
|
|