/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
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

Jens Gyldenkærne Clausen wrote:
> 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?

http://groups.google.dk/groups?selm=b3ap29%2423nk%241%40news.cybercity.dk&rnum=1

--
Jakob Andersen

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 skrev:

>> Kan du vise et eksempel på det?
>
> http://groups.google.dk/groups?selm=b3ap29%2423nk%241%40news.cy
> bercity.dk&rnum=1

Ser smart ud. Kan man noget lignende i MSSQL (":=" virker ikke
her).
--
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 14:49

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote
> Ser smart ud. Kan man noget lignende i MSSQL (":=" virker ikke
> her).

Ikke umiddelbart, men der er et par "workarounds":
<http://support.microsoft.com/default.aspx?scid=kb;EN-US;q186133>

--
Jakob Andersen



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

Jakob Andersen skrev:

> Ikke umiddelbart, men der er et par "workarounds":
> <http://support.microsoft.com/default.aspx?scid=kb;EN-US;q186133>

Tak for info.
--
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

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste