Avatar billede JenZen Novice
06. maj 2008 - 21:31 Der er 23 kommentarer og
1 løsning

sql limit

Jeg har sen sql base med flg. felter:
RecID
Item
Name
Date

Data deri kan se således ud:

RecID        Item          Name            Date
1            Test          Test 1          01-01-2000
2            Test          Test 1          01-02-2000

Og ja det er korrekt at den eneste forskel på de 2 er RecID od Date.

Det jeg så skal have den til er at spytte den seneste, og kun den seneste ud af dem der er oprettet.

Så når jeg søger på Test skal den kun vise mig den der hedder
RecID        Item          Name            Date
2            Test          Test 1          01-02-2000
Idet det er den seneste pr. dato.

Så jeg skal altså have lidt hjælp til en sql streng.
SQL = "HJÆLP"
Avatar billede JenZen Novice
06. maj 2008 - 21:32 #1
Dog søger jeg på kun en del af Item, og det er ITEM der er søge feltet, skal den vise alle dem der starter med T, og igen kun de seneste.
Avatar billede goose Nybegynder
06. maj 2008 - 21:42 #2
Hvad med:

SQL = "select * from TABEL order by [date] DESC LIMIT 1"

/Goose
Avatar billede JenZen Novice
06. maj 2008 - 21:47 #3
Hivs jeg vælger order by, så viser den jo stadig alle datoer ik?
Avatar billede JenZen Novice
06. maj 2008 - 21:54 #4
Skriver jeg ovenstående sql får jeg fejlen  "Incorrect syntax near 'limit'. "
Avatar billede JenZen Novice
06. maj 2008 - 22:10 #5
Hvis jeg skal skrive noget er det vel:
SQL = "select TOP 1 * from TABEL order by [date] DESC"
Men den viser mig kun én record.
Avatar billede goose Nybegynder
06. maj 2008 - 22:28 #6
Så lige håndbold :o)

Ja det er min fejl, min SQL er til mySQL

Hvis du bruger SQL = " select top 1 * from TABEL order by [date] DESC" så viser den jo kun én record, men var det ikke det ville?

Alternativt, så kan du jo også checke på recID med:

SQL = " select top 1 * from TABEL order by [date] DESC, recID DESC"

/Goose
Avatar billede JenZen Novice
06. maj 2008 - 22:34 #7
Her er min streng:

SQL = "SELECT Top 1 x.*, (SELECT COUNT(RecID) FROM CerfTbl WHERE (FatherCertNo = x.CertNo)) as NoOfSubCerfs FROM CerfTbl x WHERE (" & StrWhere & " AND FatherCertNo Is Null) ORDER BY [DATEFLD] DESC, [RecID] DESC"

Og den viser kun én record når jeg søger på Test selvom der er mange der hedder det.
Any Idea ?
Avatar billede goose Nybegynder
06. maj 2008 - 22:41 #8
Det er jo fordi du har top 1 med i din streng, så finder den jo kun én?

Du startede med at skrive:

"Det jeg så skal have den til er at spytte den seneste, og kun den seneste ud af dem der er oprettet."

- så hvis det ikke kun er én du vil finde, havd er det så?

/Goose
Avatar billede JenZen Novice
06. maj 2008 - 22:46 #9
Forestil dig disse data i basen:

RecID        Item          Name            Date
1            Test          Test 1          01-01-2000
2            Test          Test 1          01-02-2000
3            Testos        Test 2          01-03-2000
4            Testos        Test 2          01-04-2000

Når jeg så søger på bogstavet T ( Som søger i feltet Item )
Skal den vise mig flg.:

RecID        Item          Name            Date
2            Test          Test 1          01-02-2000
4            Testos        Test 2          01-04-2000
Og det skal den fordi data i de 2 records er ikke ens, men indeholder begge bogstavet t i item.
Så den skal ligesom udligne dem hvor data i felterne er ens og kun vise den sidste nye.

Er du med ?
Avatar billede goose Nybegynder
06. maj 2008 - 23:05 #10
Nå på den måde, så skal du nok istedet have noget group by så du grupperer på item

Det her dummy eksempel er utestet, men det burde være noget i stil med:

SQL="select * from TABEL where [dit kriterie her] GROUP BY item Order By [Date] Desc"

/Goose
Avatar billede goose Nybegynder
06. maj 2008 - 23:07 #11
Hvilket så vil sige, at din SQL burde se ud som noget i stil med:

SQL = "SELECT x.*, (SELECT COUNT(RecID) FROM CerfTbl WHERE (FatherCertNo = x.CertNo)) as NoOfSubCerfs FROM CerfTbl x WHERE (" & StrWhere & " AND FatherCertNo Is Null) GROUP BY item ORDER BY [DATEFLD] DESC, [RecID] DESC"

/Goose
Avatar billede JenZen Novice
06. maj 2008 - 23:13 #12
Så får jeg denne fejl.

Microsoft OLE DB Provider for SQL Server error '80040e14'

Column 'CerfTbl.RecID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Avatar billede JenZen Novice
06. maj 2008 - 23:40 #13
Er det egentlig ikke mere DISTINCT der skal bruges ?
Avatar billede fennec Nybegynder
07. maj 2008 - 09:15 #14
Du skal have en max og group by ind:

SELECT    MAX(recid) AS recId, item, name, MAX(date) AS Date
FROM    CerfTbl
GROUP BY item, name
Avatar billede JenZen Novice
07. maj 2008 - 19:57 #15
Fennec hvordan vil du om skrive min nuværende SQL streng med de data du har sendt ?
Avatar billede fennec Nybegynder
08. maj 2008 - 08:21 #16
Noget i denne stil:
SQL = "SELECT MAX(x.recid) AS recId, x.item, x.name, MAX(x.date) AS DATEFLD,
(SELECT COUNT(RecID) FROM CerfTbl WHERE (FatherCertNo = x.CertNo)) as NoOfSubCerfs
FROM CerfTbl x
GROUP BY x.item, x.name
WHERE (" & StrWhere & " AND FatherCertNo Is Null)
ORDER BY [DATEFLD] DESC, [RecID] DESC"
Avatar billede fennec Nybegynder
08. maj 2008 - 08:22 #17
"MAX(x.date) as DATEFLD" skal måske være "MAX(x.DATEFLD) as DATEFLD" i stedet...
Avatar billede solle Nybegynder
08. maj 2008 - 11:06 #18
Prøv det her:

SELECT    MAX(RecID) AS RecID, Item, MAX([Date]) AS Date,
                          (SELECT    COUNT(DISTINCT Item)
                            FROM          Table1
                            WHERE      Item = Item) AS Amount
FROM        Table1
GROUP BY Item
Avatar billede JenZen Novice
08. maj 2008 - 21:05 #19
Fennec ->
Så får jeg denne fejl.

Microsoft OLE DB Provider for SQL Server error '80040e14'

Incorrect syntax near the keyword 'WHERE'.
Avatar billede fennec Nybegynder
09. maj 2008 - 08:21 #20
Group by og where skal lige byttes om:

WHERE (" & StrWhere & " AND FatherCertNo Is Null)
GROUP BY x.item, x.name
Avatar billede JenZen Novice
13. maj 2008 - 08:54 #21
Fennec -> JEg havde vist lavet en lille fejl.

RecID        CertNo      Datefld
1            Test        01-01-2000
2            Test        01-02-2000
3            Testos      01-03-2000
4            Testos      01-04-2000

Når jeg så søger på bogstavet T ( Som søger i feltet Item )
Skal den vise mig flg.:
RecID        CertNo        Datefld
2            Test          01-02-2000
4            Testos        01-04-2000

Til ovenstående vil jeg bruge flg. sql streng:
    SQL = "SELECT MAX(x.recid) AS RecId, x.CertNo2, MAX(x.DateFld) AS DATEFLD, (SELECT COUNT(RecID) FROM CerfTbl WHERE (FatherCertNo = x.CertNo)) as NoOfSubCerfs FROM CerfTbl x WHERE (" & StrWhere & " AND FatherCertNo Is Null) GROUP BY x.CertNo ORDER BY [DATEFLD] DESC, [RecID] DESC"

Gør det nogen forskel om der er 40 andre felter i basen, det er jo ikke nogen jeg skal bruge i denne her sammenhæng.

Under alle omstændigheder får jeg denne fejl:

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede JenZen Novice
13. maj 2008 - 12:13 #22
Har delvist fundet ud af noget, hvis jeg bruger en sql query og indtaster nedenstående:
SELECT    *
FROM    CerfTbl    D
WHERE    DateFld =
    (
    SELECT    MAX (DateFld)
    FROM    CerfTbl
    WHERE    CertNo    = D.CertNo
    )
ORDER BY    CertNo, DateFld;
Så får jeg det output jeg skal bruge.

Så nu skal jeg have flettet det sammen med min nuværende sql streng:
SQL = "SELECT x.*, (SELECT COUNT(RecID) FROM CerfTbl WHERE (FatherCertNo = x.CertNo)) as NoOfSubCerfs FROM CerfTbl x WHERE (" & StrWhere & " AND FatherCertNo Is Null) ORDER BY " & SortField & " " & SortOrder

Any Ideas ?
Avatar billede fennec Nybegynder
15. maj 2008 - 09:44 #23
Jeg kan se du har forskel på CertNo2 og CertNo i din select og group by. Går ud fra at det er CertNo2 du vil vælge og derfor er det også den, der skal stå på group by:

GROUP BY x.CertNo2
Avatar billede JenZen Novice
24. juni 2008 - 22:29 #24
Har selv løst det.
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
Kurser inden for grundlæggende programmering

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