Avatar billede bojohansen Nybegynder
27. april 2001 - 02:02 Der er 18 kommentarer og
2 løsninger

Lave en Select SQL streng fra et andet record set

Jeg har en database med Tabel \'MedlemsInfo\' med Feldt \'MedlemsId\' \'SponsorId\' \'Fornavn\' og lidt flere.
En lille forklaring :
Kaj er i DB\'en med \'MedlemsId\' = 1
Børge er også i DB\'en med \'MedlemsId\' = 2 og \'SponsorId\' = 1
Lars er også i DB\'en med \'MedlemsId\' = 3 og \'SponsorId\' = 2
Kaj logger ind på sin se medlems side hvor han kan se alle dem der har hans MedlemsId nummer i deres \'SponsorId\' feldt, i dette tilfælde Børge.

YourId = Request.Cookies(”CookieNavn”)(”YourId”)
Select Fornavn, MedlemsId From MedlemsInfo Where SponsorId  = ’” & YourId & ”’

Dvs :

Navn = Børge    MedlemsId = 2
Dette udtræk kunne selvfølgelig indeholde 100 navne så derfor har jeg et loop så alle vises.

Men hvordan Laver jeg lige en SELECT COUNT på alle dem som har Børge’s Id nummer i feldtet ’SponsorId’ altså i dette tilfælde Lars ???

Skal jeg ligge en SQL i et loop så den laver en Conn for hvert loop den laver eller hvad skal jeg lige gøre
Avatar billede bojohansen Nybegynder
27. april 2001 - 02:04 #1
Så der kommer til at stå

Navn = Børge  MedlemsID = 2    Har sponsoreret = 1 (Lars)
Avatar billede nute Nybegynder
27. april 2001 - 02:12 #2
se om ikke dette kan hjelpe deg litt på vei

<%
SQL = \"SELECT * FROM MedlemsInfo ORDER BY MedlemsId\"
Set RS = Conn.Execute( SQL )
while not RS.EOF
  response.write \"Navn: \" & RS(\"Fornavn\") & \"  MedlemsId: \" & RS(\"MedlemsId\") & \"<br>Har sponsorert: \"
  sSQL = \"SELECT * FROM MedlemsInfo WHERE SponsorId = \" & RS(\"MedlemsID\") & \" ORDER BY MedlemsId\"
  Set sRS = Conn.Execute( sSQL )
  response.write sRS.RecordCount & \" (\"
  while not sRS.EOF
    response.write sRS(\"Fornavn\") & \", \"
    sRS.MoveNext
  wend
  sRS.Close
  response.write \")<br><br>\"
  RS.MoveNext
wend
%>

/nute
Avatar billede ldanielsen Nybegynder
27. april 2001 - 07:31 #3
Jeg ville vælge at lave to queries

Set RecCount = Con.Execute(\"SELECT Count(*) AS TheCount FROM MedlemsInfo Where SponsorId  = \'\" & YourId &\"\'\")

Set Rec = Con.Execute(\"SELECT Fornavn, MedlemsId FROM MedlemsInfo WHERE SponsorId  = \'\" & YourId & \"\'\")

Response.Write \"Antal = \" & RecCount(\"TheCount\")

if not Rec.BOF then
  do while not Rec.EOF
    Response.Write \"Navn = \" & Rec(\"Fornavn\") & \" - MedlemsId = \" & Rec(\"MedlemsId\")
    Rec.Movenext
  loop
end if
Avatar billede nute Nybegynder
27. april 2001 - 10:48 #4
ldanielsen >> well...forsåvidt enig. Hvis jeg skulle skrive \"skikkelig\" SQL, så ville jeg har valgt den måten, men \"uheldigvis\" har RecordSet objectet en innebygget funksjon til å telle for deg, så hvorfor ikke benytte seg av det ?!
Avatar billede ldanielsen Nybegynder
27. april 2001 - 13:21 #5
Fordi jeg ikke kan få den til at virke! Den svarer -1 ligemeget hvad jeg gør
Avatar billede ldanielsen Nybegynder
27. april 2001 - 13:23 #6
Så vidt jeg ved kræver den at du bruger en af de \"tunge\" cursor\'e, og det vil jeg ikke så gerne.

Jeg har nemlig ikke brug for dem, da jeg styrer alle operationer med SQL; INSERT, UPDATE, DELETE
Avatar billede nute Nybegynder
27. april 2001 - 13:27 #7
ldanielsen >> jeg er enig med deg...jeg ville uten tvil benytte den metode du skriver, men for enkelthetens skyld postet jeg med RecordCount versjonen. Jeg liker heller ikke å benytte meg av de innebygde \'AddNew\' og \'Update\' og alle disse merkelige metodene i min kode, men jeg ser at tendensen her inne er at dette er hva folk benytter seg av, og dermed poster jeg mine innlegg etter hva folk har for vane å kode :)
Avatar billede ldanielsen Nybegynder
27. april 2001 - 13:34 #8
OK, men når du åbner dit recordset med Con.Execute, så får du jo default cursor, og så virker fx. RecordCount ikke. Har jeg ret. Hvordan sætter du så cursoren, og hvad er det nu den skal hedde, det er så længe siden jeg har brugt dem.

Jeg spørger fordi bojohansen sikkert får problemet hvis han bruger \"din\" metode.
Avatar billede nute Nybegynder
27. april 2001 - 13:35 #9
jeg har ingen problemer med å benytte recordcount med Conn.Execute

/nute
Avatar billede ldanielsen Nybegynder
27. april 2001 - 13:43 #10
Det har jeg!! Den svarer -1

Jeg bruger dette

Set Con=Server.CreateObject(\"ADODB.Connection\")

Con.Open (\"Provider=SQLOLEDB;Data Source=SQLServerensNavn;Initial Catalog=databasensNavn;User ID=brugernavn;password=mitPassword\")

Set Rec = Con.Execute (\"SELECT Whatever FROM Tabellen\")
   
Avatar billede ldanielsen Nybegynder
27. april 2001 - 13:46 #11
Er det noget man kan med Access??

Jeg så lige i spm 68204:

set rs = server.createobject(\"ADODB.recordset\")
rs.open SQLstr, conn, 3,3

Det er sådan noget der skal bruges.

IKKE fordi jeg har brug for det, er bare interesseret.

Hilsen Lars
Avatar billede nute Nybegynder
27. april 2001 - 14:16 #12
men så gjør vi bare det...

det er et stykke tid siden jeg har bruk disse selv...sitter og koder i Java for tidem, og det lett å glemme disse \"små\" detaljene....

;-)

/nute
Avatar billede bojohansen Nybegynder
27. april 2001 - 14:50 #13
Jeg blander mig lige lidt ;-)) *LOL*

\'YourId = Request.Cookies(\"CookieNavn\")(\"YourId\")
Set Rs1LevelNames = Conn.Execute (\"Select Fornavn, EfterNavn, MedlemsIdNr From MedlemsInfo Where SponsorId  = \'\" & YourId & \"\'\")
%>
<table width=\"500\" border=\"0\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">
<%Do While Not Rs1LevelNames.EOF
Set Rs2LevelCount = Conn.Execute (\"SELECT COUNT(MedlemsIdNr) AS [2LevelTotal] FROM MedlemsInfo WHERE SponsorId = \'\" & Rs1LevelNames(\"MedlemsIdNr\") & \"\'\")
  Response.Write \"  <tr>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"MedlemsIdNr\") & \"</td>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"Fornavn\") & \"</td>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"EfterNavn\") & \"</td>\"
  Response.Write \"    <td>\" & Rs2LevelCount(\"2LevelTotal\") & \"</td>\"
  Response.Write \"  </tr>\"
Rs1LevelNames.MoveNext
loop
%>
</table>

Er det så den mindst resource krævense???

Har ikke lige testet den.
Avatar billede bojohansen Nybegynder
27. april 2001 - 14:51 #14
Krævense = Krævende :-)
Avatar billede nute Nybegynder
27. april 2001 - 14:54 #15
vel en korrekt og bedre utgave av den, ville vel være:

YourId = Request.Cookies(\"CookieNavn\")(\"YourId\")
Set Rs1LevelNames = Conn.Execute (\"Select Fornavn, EfterNavn, MedlemsIdNr From MedlemsInfo Where SponsorId  = \" & YourId)
%>
<table width=\"500\" border=\"0\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">
<%Do While Not Rs1LevelNames.EOF
Set Rs2LevelCount = Conn.Execute (\"SELECT COUNT(MedlemsIdNr) AS 2LevelTotal FROM MedlemsInfo WHERE SponsorId = \" & Rs1LevelNames(\"MedlemsIdNr\"))
  with response
    .Write \"  <tr>\"
    .Write \"    <td>\" & Rs1LevelNames(\"MedlemsIdNr\") & \"</td>\"
    .Write \"    <td>\" & Rs1LevelNames(\"Fornavn\") & \"</td>\"
    .Write \"    <td>\" & Rs1LevelNames(\"EfterNavn\") & \"</td>\"
    .Write \"    <td>\" & Rs2LevelCount(\"2LevelTotal\") & \"</td>\"
    .Write \"  </tr>\"
  end with
  Rs2LevelCount.Close
Rs1LevelNames.MoveNext
loop
%>
</table>

Avatar billede bojohansen Nybegynder
27. april 2001 - 15:03 #16
Ok, men er det noget af det hurtigeste man kan opnå, eller ville andet være bedre??
Avatar billede ldanielsen Nybegynder
27. april 2001 - 15:04 #17
Det er først nu jeg forstår at der skal være en count på alle posterne, det er jo noget HELT andet


Set Rs1LevelNames = Conn.Execute (\"Select m1.Fornavn AS mFornavn, m1.EfterNavn AS mEfternavn, m1.MedlemsIdNr AS mMedlemsIdNr (SELECT COUNT(*) FROM MedlemsInfo m2 WHERE m2.SponsorId = m1.MedlemsIdNr) AS 2LevelTotal From MedlemsInfo m1 Where m1.SponsorId  = \" & YourId)
%>
<table width=\"500\" border=\"0\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">
<%Do While Not Rs1LevelNames.EOF
Response.Write \"  <tr>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"mMedlemsIdNr\") & \"</td>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"mFornavn\") & \"</td>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"mEfterNavn\") & \"</td>\"
  Response.Write \"    <td>\" & Rs1LevelNames(\"2LevelTotal\") & \"</td>\"
  Response.Write \"  </tr>\"
Rs1LevelNames.MoveNext
loop
%>
</table>

nested query, ikke testet, men kun én query.

Tester lige, øjeblik
Avatar billede ldanielsen Nybegynder
27. april 2001 - 15:09 #18
Mangler et komma: 
... m1.MedlemsIdNr AS mMedlemsIdNr, (SELECT COUNT(*) ...

Ellers tror jeg da den er ok
Avatar billede bojohansen Nybegynder
27. april 2001 - 15:59 #19
Hmmm hvor kommer alle de \'m\'er fra.

Er det noget som er bygget ind i SQL???
Avatar billede ldanielsen Nybegynder
28. april 2001 - 14:46 #20
Nej, det er fordi jeg bruger tabellen medlemsinfo to gange i min sql. Så er jeg nødt til at give dem et alias, og har valgt m1 og m2, som jeg bruger:

SELECT m1.MedlemsIdNr ...

f.eks

Men i ASP kan jeg ikke skrive rs(\"m1.MedlemsIdNr\"), så jeg er også nødt til at give hvert enkelt felt et alias. Og for at et alias ikke skal være det samme som navnet på et felt, har g valgt at sætte et m foran.

SELECT m1.MedlemsIdNr AS mMedlemsIdNr ...

Derfor. Jeg kunne lige så godt have kaldt den Kurt, men det ville jo have været lidt underligt!

Virker det ellers?? (spørger jeg spændt)
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