Avatar billede Slettet bruger
25. september 2006 - 19:09 Der er 46 kommentarer og
1 løsning

Hent poster fra tabel og sorter bagefter

Jeg har 2 tabeller i en access db.

Den ene indeholder en masse artikler, den anden en masse reletioner mellem artikler/artikler eller artikler/produkter.

Jeg skal så finde alle artikler der omhandler feks produkt 123.
Jeg finder så en række poster i relation-tabellen, hvor produkt 123 er "hoved-personen". Jeg finder så de artikler der er relateret til, men de ligger jo i tilfældig orden og vil derfor ikke blive udskrevet i korrekt dato rækkefølge.

Så spørgsmålet lyder: Er det muligt at hente alle relateret artikler ud (uden af udskrive dem), for derefter at sortere efter feks dato og så først der udskrive dem ?
Avatar billede nielle Nybegynder
25. september 2006 - 19:45 #1
Hvorfor ikke bare sortere dem direkte i SQL-kaldet?

Hvordan ser dine to tabbeler ud?
Avatar billede Slettet bruger
25. september 2006 - 20:36 #2
Jeg kan (vist) ikke sortere i SQL...

Min reletions-tabel

relateFrom  |  RelateTo
product#123 | article#465
product#123 | article#587
product#321 | article#1

OG så er der article-tabellen der indeholder hvad den nu skal indeholde...
Jeg tjekker så på følgende måde og der er nogle relationer til det valgte produkt:

relFrom = "product#123"
relTo = "article#"

strSQL = "Select * from inc_relations where (relRelatedFrom='" & relFrom & "' OR relRelatedTo='" & relFrom & "') AND (relRelatedFrom LIKE '" & relTo & "%' OR relRelatedTo LIKE '" & relTo & "%')"

Og så bliver posterne jo hentet ud iforhold til hvornår relationen blev lavet, men det behøver jo ikke være samme dag som artiklen er oprettet.
Avatar billede nielle Nybegynder
25. september 2006 - 20:55 #3
Jeg tror nok at jeg ville starte med at lave din SQL om til den mere logisk korrekte:

strSQL = "
SELECT * FROM inc_relations
WHERE
{
    relRelatedFrom = '" & relFrom & "' AND
    relRelatedTo LIKE '" & relTo & "%'
)
OR
(
    relRelatedTo = '" & relFrom & "' AND
    relRelatedFrom LIKE '" & relTo & "%'
)
"

Hvordan ser tabellen med artiklerne ud? Er der er naturligt felt man kan sortere efter i denne, hvis man vil have artiklerne ud i korrekt orden?
Avatar billede Slettet bruger
25. september 2006 - 21:22 #4
Øhm, jeg kan ikke lige se hvad du har ændret i forhold til min SQL-streng!?

Nå men videre til problemet.

Tabellen articles, har et AutoID og et dato-felt, hvor dato feltet er det rigtige at sortere efter, da dato og autoID kan variere lidt fra hinanden.
Avatar billede nielle Nybegynder
25. september 2006 - 21:36 #5
> Øhm, jeg kan ikke lige se hvad du har ændret i forhold til min SQL-streng!?

Jeg har byttet om på brugen af AND og OR:

Din:

strSQL = "
SELECT *
FROM inc_relations
WHERE
(
    relRelatedFrom='" & relFrom & "' OR
    relRelatedTo='" & relFrom & "'
)
AND
(
    relRelatedFrom LIKE '" & relTo & "%' OR
    relRelatedTo LIKE '" & relTo & "%'
)
"

Min:

strSQL = "
SELECT * FROM inc_relations
WHERE
{
    relRelatedFrom = '" & relFrom & "' AND
    relRelatedTo LIKE '" & relTo & "%'
)
OR
(
    relRelatedTo = '" & relFrom & "' AND
    relRelatedFrom LIKE '" & relTo & "%'
)
Avatar billede nielle Nybegynder
25. september 2006 - 21:37 #6
Et dato-feltet af datetime-typen eller er den noget andet, f.eks. en text?
Avatar billede nielle Nybegynder
25. september 2006 - 21:44 #7
Jeg tror umiddelbart at den kan løses med noget i denne stil:

strSQL = "
SELECT *
FROM articles
WHERE articleId IN
(
    (SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%')
    UNION
    (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')
)
ORDER BY datoFelt DESC
"
Avatar billede Slettet bruger
25. september 2006 - 21:55 #8
Nåå okay, der var ændringen :)  I sidste ende vil det så ikke give samme resultat? Har selvfølgelig ikke noget mod at sifte til dit forslag, men kan der blive problemer med min SQL eller er det bare rent synsmessigt du syntes det skal skiftes ud?
Avatar billede nielle Nybegynder
25. september 2006 - 21:57 #9
Logisk set er det ikke den samme forespørgsel. Den kan derfor give forskellige resultater alt efter værdierne af relFrom og relTo.
Avatar billede Slettet bruger
25. september 2006 - 22:03 #10
Nu har jeg lavet denne SQL, men jeg får en fejl der siger:

Der er en syntaksfejl, fordi der mangler en operator.

Kan ikke lige se at jeg har lavet nogen fejl, ved du hvad der kan være galt?

strSQL = "
SELECT *
FROM con_articles
WHERE artID IN
(
(SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%')
UNION
(SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')
)
ORDER BY artDate DESC
"
Avatar billede nielle Nybegynder
25. september 2006 - 22:06 #11
VBScript skal selvfølgelig have den på formen:

strSQL = "SELECT * FROM con_articles WHERE artID IN ((SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%') UNION (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')) ORDER BY artDate DESC"

Er det den at du får fejlbeskeden i?
Avatar billede Slettet bruger
25. september 2006 - 22:06 #12
For lige at beskrive indholdet af min relation-tabel

En tilfældig linie kan se sådan ud:

product#1  |  article#56

Men SQL'en skal også køre den anden vej, altså hvis den samme linie så sådan ud:

article#56  |  product#1
Avatar billede nielle Nybegynder
25. september 2006 - 22:06 #13
25/09-2006 22:06:09> Det er jeg skam klar over. :^)
Avatar billede Slettet bruger
25. september 2006 - 22:08 #14
Jaja jeg har samlet sætningen til en lang linie, hvis det er det du mener...
Jeg får fejlen i Conn.Execute linien.
Avatar billede Slettet bruger
25. september 2006 - 22:13 #15
Jeg har aldrig brugt UNION, så du må hellere sige hvis det er noget du mangler eller er itvivl om.
Avatar billede nielle Nybegynder
25. september 2006 - 22:13 #16
Hmmm, kan ikke lige umiddelbart se hvad der er galt.

Har du mulighed for at afprøve den resulterende SQL-kommando direkte i Access?
Avatar billede Slettet bruger
25. september 2006 - 22:15 #17
Øhh afprøve den resulterende SQL-kommando direkte i Access???

Kunne man lige få en guide til det, tror jeg aldrig jeg har brugt!?
Avatar billede nielle Nybegynder
25. september 2006 - 22:16 #18
... måske er det #'tegnene den ikke er så vild med? #-tegnet har jo en speciel brug i Access sammen med datofelter.
Avatar billede Slettet bruger
25. september 2006 - 22:19 #19
Jeg havde ikke nogle problemer med #-tegnet da jeg brugte den forrige SQL. Kan det havde noget at gøre med at vi nu bruger UNION !?
Avatar billede nielle Nybegynder
25. september 2006 - 22:19 #20
Lidt handikappet af at jeg ikke har en Access ved hånden, så det bliver ud fra hukommelsen:

Først udskriver du din SQL på, sådan at du kan cut'n'pase den.

Så starter du Access og åbner databasen.

Du laver en ny Forespørgsel. Skifter over til SQL-visning, og paster så din SQL ind i denne. Så tryjjer du på eksekveringsknappen (vist nok den med "!").
Avatar billede nielle Nybegynder
25. september 2006 - 22:20 #21
Nej, UNION skulle ikke have noget specielt forhold til #'tegnet. :^)
Avatar billede Slettet bruger
25. september 2006 - 22:22 #22
Nu har jeg prøvet det i Access, og jeg får samme fejl som når jeg prøver at køre den via min web-server.
Avatar billede nielle Nybegynder
25. september 2006 - 22:29 #23
Ok, så prøv først med denne del af koden:

    (SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%')
    UNION
    (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')
Avatar billede Slettet bruger
25. september 2006 - 22:32 #24
Det kan jeg godt, den opretter en forspørgsel med kollonnen relRelatedTo, men den indeholder ingen data.
Avatar billede nielle Nybegynder
25. september 2006 - 22:35 #25
Men du får altså ingen fejl?

Så prøv at udvide den lidt, til:

SELECT *
FROM con_articles
WHERE artID IN
(
    (SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%')
    UNION
    (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')
)
Avatar billede Slettet bruger
25. september 2006 - 22:38 #26
Nu kommer den samme fejl igen. OG den vil ikke oprette forespørgslen...

Der er en syntaksfejl, fordi der mangler en operator.
Avatar billede nielle Nybegynder
25. september 2006 - 22:40 #27
Hvordan med:

SELECT *
FROM con_articles
WHERE artID IN
(
    SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%'
    UNION
    SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%'
)
Avatar billede Slettet bruger
25. september 2006 - 22:43 #28
Nu får jeg en anden fejl:

Denne handling er ikke tilladt i underforespørgsler.

Og så springer den frem til dette punkt:

SELECT * FROM con_articles WHERE artID IN (
Avatar billede nielle Nybegynder
25. september 2006 - 22:46 #29
Hmmm, det er sikkert bare en lille dum syntaksfejl som jeg ikke lige kan gennemskue.

Men lad os da så prøve noget lidt andet i stedet:

strSQL = "
SELECT *
FROM con_articles
WHERE
artID IN
(
    SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%'
)
OR
artID IN
(
    SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%'
)
ORDER BY artDate DESC
"
Avatar billede Slettet bruger
25. september 2006 - 22:52 #30
Jeg gik ud fra at denne skulle testes i ASP.

Jeg får nu fejlen:

Datatyperne stemmer ikke overens i kriterieudtrykket.

Men de felter der er ibrug her ser alle ud til at stå rigtigt.
relRelatedFrom = tekst-felt
relRelatedTo = tekst-felt
artID = autoID-felt
artDate = Dato-felt
Avatar billede nielle Nybegynder
25. september 2006 - 22:55 #31
Kan du ikke lige prøve at poste den resulterende SQL her?
Avatar billede Slettet bruger
25. september 2006 - 22:57 #32
SELECT * FROM con_articles WHERE artID IN (SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = 'products#4' AND relRelatedTo LIKE 'news#%') OR artID IN (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = 'products#4' AND relRelatedFrom LIKE 'news#%') ORDER BY artDate DESC
Avatar billede nielle Nybegynder
25. september 2006 - 22:57 #33
Vent et øjeblik ... er artID dit autoID? Det skal ikke være den.

De to del-led:

SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%'

- og:

SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%'

- udtrækker noget på formen:

article#465

- altså den artikel du skal have fat på. Det er den som der skal ledes efter i con_articles.
Avatar billede nielle Nybegynder
25. september 2006 - 22:59 #34
Svare "article#465" så til den post hvor artID er "465"?
Avatar billede Slettet bruger
25. september 2006 - 23:01 #35
Ja artID er artiklens autoID og det er så det der skal findes i news#465
Avatar billede Slettet bruger
25. september 2006 - 23:03 #36
Hov beklager jeg forvirre lidt med article og news, men news er det rigtige ord at bruge i denne sammenhæng.
Avatar billede nielle Nybegynder
25. september 2006 - 23:12 #37
Det er nu ikke helt en optimal måde at lave din database på.

Måske virker dette:

strSQL = "
SELECT *
FROM con_articles
WHERE
'news#' & artID IN
(
    SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%'
)
OR
'news#' & artID IN
(
    SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%'
)
ORDER BY artDate DESC
"
Avatar billede Slettet bruger
25. september 2006 - 23:12 #38
Hvad skal jeg gøre med din besked fra 25/09-2006 22:57:54. Hvis du ikke skal bruge artiklens autoID, hvad skal du så bruge ?
Avatar billede nielle Nybegynder
25. september 2006 - 23:14 #39
Har du prøvet den kode jeg postede?
Avatar billede Slettet bruger
25. september 2006 - 23:18 #40
Har lige testet den og den ser faktisk ud til at virke. Men den laver bare fejl hvis der ikke er nogle artikler, selvom jeg har sat en EOF og BOF ind i min sætning.
Avatar billede nielle Nybegynder
25. september 2006 - 23:19 #41
Det lyder mystisk?

Hvordan ser din ASP-kode da ud?
Avatar billede nielle Nybegynder
25. september 2006 - 23:23 #42
For lige at vende tilbage til vores UNION for før... Mon ikke denne så virker:

strSQL = "
SELECT *
FROM con_articles
WHERE 'news#' & artID IN
(
(SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%')
UNION
(SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%')
)
ORDER BY artDate DESC
"
Avatar billede nielle Nybegynder
25. september 2006 - 23:23 #43
Smutter for i dag. g'nat. :^)
Avatar billede Slettet bruger
25. september 2006 - 23:28 #44
Nej den virker ikke, den siger bare "Der er en syntaksfejl, fordi der mangler en operator."

Ja, go' nat :)
Avatar billede Slettet bruger
25. september 2006 - 23:35 #45
Har lige løst problemet med EOF og BOF, jeg havde får sat Do på den forkerte side af EOF/BOF-sætningen.

Og jeg bruger som sagt denne SQL, da den virker helt som den skal:

strSQL = "
SELECT *
FROM con_articles
WHERE
'news#' & artID IN
(
SELECT relRelatedTo FROM inc_relations WHERE relRelatedFrom = '" & relFrom & "' AND relRelatedTo LIKE '" & relTo & "%'
)
OR
'news#' & artID IN (SELECT relRelatedFrom FROM inc_relations WHERE relRelatedTo = '" & relFrom & "' AND relRelatedFrom LIKE '" & relTo & "%'
)
ORDER BY artDate DESC
"
Avatar billede nielle Nybegynder
26. september 2006 - 06:32 #46
Svar :^)
Avatar billede Slettet bruger
26. september 2006 - 10:31 #47
Her er så dine point og så siger jeg mange tak for hjælpen :)
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