Avatar billede kroger Nybegynder
23. juli 2003 - 22:44 Der er 74 kommentarer og
1 løsning

SQl sortering af resultat part2

Jeg havde i et tidligere spm, spurgt omkring at få sorteret et resultat fra mssql serveren, se evt.: http://www.eksperten.dk/spm/378404 , var desværre lidt for hurtig på aftrækkeren med at acceptere

Jeg har et forum, hvor at der vises indlæg ala "snitz forum", mit problem er at jeg skal have indlæg der er besvaret til at ligge øverst.
Oprindelige indlæg har reference = 0, mens besvarelser har reference = (id på oprindeligt indlæg). Mit problem er at det skal sorteres efter id fra alle indlæg (for at besvarede indlæg ryger øverst), men kun de indlæg der har reference = 0 skal vises.

Et forsøg på at opnå det har jeg lavet en ekstra tabel der indeholder alle id´er og jeg prøver så at bruge den til sortering, men det kan jeg ikke helt få den til.

Min sql er:
Select * From topic as a LEFT JOIN topicsort as b ON b.idsort=a.id WHERE a.forumid ='" & Request.Querystring("fid") & "' AND a.reference = 0 AND b.idsort <> 0 Order by b.id4 DESC

topic er den tabel der indeholder alle indlæggene (og besvarelser), mens topicsort indeholder id fra alle indlæg

Håber i forstod den lidt kringlede forklaring...
Avatar billede _darkstar_ Nybegynder
23. juli 2003 - 22:50 #1
select * from (
select topic1.*, count(topic2) from topic topic1, topic topic2
where topic1.id += topic2.idsort
group by topic1.*)
order by count(topic2)

Sætningen virker med stor sandsynlighed ikke, men prøv. Muligvis skal += være =+.
Avatar billede _darkstar_ Nybegynder
23. juli 2003 - 22:50 #2
Det ville være en STOR hjælp hvis du skrev hvilke fleter der blev brugt til hvad.
Avatar billede kroger Nybegynder
23. juli 2003 - 23:00 #3
God ide :)

Så vidt jeg kan udlede af din kode kan jeg bruge en count på topicsort til sorteringen.

en lille liste:
topic:
    id - auto
    forumid - reference til hvilket forum den tilhøre
   
topicsort:
    id4 - auto
    idsort - indeholder id fra poster i topic

Håber det gjorde det lidt nemmere
Avatar billede kroger Nybegynder
23. juli 2003 - 23:01 #4
Prøvede lidt med din kode, men jeg forstår den ikke helt nok til at tilpasse den...
Avatar billede kroger Nybegynder
23. juli 2003 - 23:14 #5
Som jeg har forstået det henviser topic1 til topic mens topic2 henviser tiltopicsort, men hvad så med topic? og += er det bare en tastefejl eller...
Avatar billede kroger Nybegynder
23. juli 2003 - 23:28 #6
Har oppet pointene til 100.....
Avatar billede netro Nybegynder
23. juli 2003 - 23:44 #7
Du behøver ingen ekstra tabeller - bare et korrekt SQL-statement. Jeg skal lige forstå dig ret. Du har en tabel med tråde, og du har en tabel med besvarelser, der referer til den pågældende tråds id, ik'?
Avatar billede kroger Nybegynder
23. juli 2003 - 23:48 #8
Niks, det hele ligger i samme tabel, jeg tænkte at det ikke ville gøre nogen forskel umiddelbart, men det kan da godt være jeg tager fejl. Mit layout for tabellen der indeholder tråde er:

id - auto, identity
forumid - til reference af hvilket forum posten tilhører
reference - er 0 hvis nyt emne, er (id til oprindelig post), hvis besvarelse
dato
klokken
navn
overskrift
tekst

Den anden tabel jeg lavede (topicsort), var kun som et forsøg på at løse mit problem
Avatar billede kroger Nybegynder
23. juli 2003 - 23:52 #9
Det som er mit hoved brud er at jeg siger jeg kun vil have de poster der indeholder reference = , men jeg vil godt have sorteret efter alle poster der er i tebellen ligemeget hvad reference er, og det er jo lidt modsigende. En helt grundlæggende udgave af select ville være:

Select * FROM topic WHERE forumid ='" & Request.Querystring("fid") & "' AND reference = 0 ORDER by id DESC;

Men dette gør jo at den kun sortere efter de poster der har reference = 0
Avatar billede _darkstar_ Nybegynder
23. juli 2003 - 23:58 #10
Skrev du ikke noget med at hvert indlæg havde et felt som refererede til id'et på  den artikel, som man havde svaret på (NULL hvis ingem)?

Hvad er navnet på det felt?
Avatar billede netro Nybegynder
24. juli 2003 - 00:03 #11
Nu er det ikke for at lyde hellig, men det er meget dårlig databasestruktur at blande de forskellige kategorier sammen på den måde.
Hvis du har mod på at redesigne det, så gør det således:

Tabel (Spm)
===========
- SpmID
- Dato
- Overskrift
- Tekst
- BrugerID

Tabel (Svar)
============
- SvarID
- Dato
- Tekst
- BrugerID
- SpmID

Her refererer "SpmID" i tabellen "Svar" til "SpmID" i tabellen "Spm".
Avatar billede kroger Nybegynder
24. juli 2003 - 00:09 #12
Ikke NULL, men 0. Feltet er reference, og det fungere på den måde at hvis feltet har værdien 0 så er det et nyt indlæg. Har feltet en værdi over 0 f.eks. 1, så er det en besvarelse. Den værdi feltet har når det er en besvarelse svarer til id på det indlæg som man har besvaret.

Måske er det nemmere hvis jeg liger viser min insertkoder:

"opret nyt indlæg:"
pstCreate = "Insert into topic "
pstCreate = pstCreate & " ( forumid, "
--------------
pstCreate = pstCreate & "reference, "
---------------
pstCreate = pstCreate & "dato, "
pstCreate = pstCreate & "klokken, "
pstCreate = pstCreate & "navn, "
pstCreate = pstCreate & "overskrift, "
pstCreate = pstCreate & "tekst) "

pstCreate = pstCreate & "values( "

'Hentning af Form data
pstCreate = pstCreate & "'" & Request.Form("fid") & "', "
---------------
pstCreate = pstCreate & "'0', "
------------------
pstCreate = pstCreate & "'" & date & "', "
pstCreate = pstCreate & "'" & klokken & "', "
pstCreate = pstCreate & "'" & navn & "', "
pstCreate = pstCreate & "'" & overskrift & "', "
pstCreate = pstCreate & "'" & tekst & "'); "


"Besvar indlæg:"
pstCreate = "Insert into topic "
pstCreate = pstCreate & " ( forumid, "
---------------
pstCreate = pstCreate & "reference, "
-----------------
pstCreate = pstCreate & "dato, "
pstCreate = pstCreate & "klokken, "
pstCreate = pstCreate & "navn, "
pstCreate = pstCreate & "tekst) "

pstCreate = pstCreate & "values( "

'Hentning af Form data
pstCreate = pstCreate & "'" & Request.Form("fid") & "', "
-----------------------
pstCreate = pstCreate & "'" & Request.Form("tid") & "', "
-----------------------
pstCreate = pstCreate & "'" & date & "', "
pstCreate = pstCreate & "'" & klokken & "', "
pstCreate = pstCreate & "'" & navn & "', "
pstCreate = pstCreate & "'" & tekst & "'); "

Har lavet ---------- omkring reference felter
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:11 #13
netro>>> Det er jeg lodret uenig med dig i.

jeg vil med glæde finde de første par databasebøger frem som siger det modsatte.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:11 #14
Netro: Jeg er altid oplagt på at gøre det bedre, og det der gør alligevel ikke den helt store forskel. Men hvordan får jeg den så til at sortere på den rigtige måde efter id´er? Så skal den vel på en eller anden måde sammenligne de 2 tabeller....
Avatar billede kroger Nybegynder
24. juli 2003 - 00:12 #15
forskel rent kodemæssigt
Avatar billede kroger Nybegynder
24. juli 2003 - 00:13 #16
Request.Form("tid") = topicid , d.v.s. det oprindilge indlægs id......
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:15 #17
Prøv

SELECT * FROM (
    SELECT topic1.*, count(topic2.*) AS topic_count
    FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference
    GROUP BY topic1.*)
ORDER BY topic_count DESC
Avatar billede netro Nybegynder
24. juli 2003 - 00:16 #18
darkstar -> Du kan da ikke ved dine fulde fem påstå, at det er god databasestruktur at sammenblande data på den måde. Angiver du også en kundes fulde navn i en enkelt kolonne? Havde du tænkt dig, at feltet overskrift kun skulle udfyldes, når den pågældende post er et spørgsmål?
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:17 #19
korger+netro>>> Netros forslag er en rigtig dårlig idé.

Hvis der er tale om indlæg, hvor data stort set er de samme, er det oplagt at hælde dem i den samme tabel. Det eneste som jeg vil opfordre dig til er at bruge NULL i stedet for 0 når det gælder nye indlæg. Det andet er noget skidt.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:17 #20
netro>>> Se ovenfor.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:21 #21
netro>>> Du har skrevet to tabeller som er identiske, pånær en overskrift og en reference. Ja. jeg ville med glæde anbringe det hele i en tabel.

1) Fordi at folk nogle gange gerne vil kunne sætte en overskrift på deres svar. Som f.eks. i Computerworlds forum.
2) Fordi at din struktur kræver noget særlig kode som skal tage hensyn til at den træstruktur som man skal behandle har et særligt 1. niveau som ligegr i en anden tabel.
3) Fordi at man - i særlige tilfælde - måske gerne vil kunne hægte et indlæg som startede i toppen på en eksisterende tråd.

Specielt nummer 2 er en killer. Anbringer man data i to forskellige tabeller vokser den kode som skal behandle dem med 100% (+/-).
Avatar billede netro Nybegynder
24. juli 2003 - 00:23 #22
Så lad mig spørge dig, hvordan du f.eks. vil udtrække de spørgsmål/tråde, hvor en bruger deltager uden en subselect?
Avatar billede kroger Nybegynder
24. juli 2003 - 00:23 #23
Netro jeg prøvede din kode, og må indrømme jeg forstår den ikke helt... Men jeg fik denne fejl:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near '*'.
/forum/topics.asp, line 130

Linie 130 er:
Set rs = objConn.Execute(strSQL)
Men det er jo den den altid brokker sig over ved sql fejl
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:23 #24
...og antallet af fejl er proportionalt med antallet af kodelinier.
Avatar billede netro Nybegynder
24. juli 2003 - 00:24 #25
Jeg har ikke givet dig nogen kode - det må være darkstar, du mener.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:26 #26
Sorry netro, ja det var til darkstar
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:27 #27
netro>>> Lad os antage at du har en eller anden drønsmart måde at gøre det på, som er meget nemmere end hvis det hele ligger i en tabel.

Så kan jeg bevise at jeg kan gøre det ligeså smart med blot een tabel ved at lave to views som indeholder nøjagtig de samme data som der ellers ville være i dine tabeller. Views kan indskrives direkte i SQL-sætninger og hvis de er trivielle - hvilket de er, koster de ikke ekstra i performance.

View 1:
select SpmID, Dato, Overskrift, Tekst, BrugerID from topic

View 2:
select  SvarID, Dato, Tekst, BrugerID, SpmID from topic

Hvis du stadigvæk ikke er overbevist, så skriv den SQL-forespørgsel til dine to tabeller, som du mener jeg ikke kan lave ligesågodt med een tabel.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:28 #28
SELECT * FROM (
    SELECT topic1.*, count(topic2.*) AS topic_count
    FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference
    GROUP BY topic1.*)
ORDER BY topic_count DESC

Det er topic1.* der giver fejlen. Du skal indsætte alle topic1's felter, altså

topic1.id, topic1.reference og så videre.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:29 #29
...virker det ikke, så skift også "topic2.*" ud med "topic2.id".
Avatar billede kroger Nybegynder
24. juli 2003 - 00:30 #30
også ved GROUP BY?
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:30 #31
Jeps.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:31 #32
...det er faktisk ved GROUP BY at jeg tror at det går galt. Den først forekomst burde virke, men skift hellere begge to ud - så er det mere konsistent.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:35 #33
Nu får jeg denne her:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'count'.
Avatar billede netro Nybegynder
24. juli 2003 - 00:37 #34
darkstar -> Så forudsætter du samtidig, at databasen understøtter både views og subselects. Hvordan vil du lave det i f.eks. en MySQL 3.53?
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:38 #35
Skriv lige sætningen som den ser ud nu.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:38 #36
netro>> Bring din SQL-sætning her. Så er det nemmere at snakke.
Avatar billede netro Nybegynder
24. juli 2003 - 00:39 #37
Hvilken sætning?
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:39 #38
... og nej to gange - views er ikke nødvendige og hvis min sætning bruger subselects er det fordi at din også gør det.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:39 #39
SELECT * FROM (SELECT topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst count(topic2.id, topic2.forumid, topic2.reference, topic2.dato, topic2.klokken, topic2.navn, topic2.overskrift, topic2.tekst) AS topic_count FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference GROUP BY topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst) ORDER BY topic_count DESC
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:40 #40
netro>>> som jeg skrev: "Hvis du stadigvæk ikke er overbevist, så skriv den SQL-forespørgsel til dine to tabeller, som du mener jeg ikke kan lave ligesågodt med een tabel.".
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:43 #41
kroger>>> count-ddelen skal være count(topic2.id)
Avatar billede netro Nybegynder
24. juli 2003 - 00:44 #42
Det skal der vel ikke meget fantasi til at forestille sig. Left Join Spm med Svar hvor Svar.BrugerID=?.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:46 #43
Tja, det kunne jeg næsten regne ud( hovedet hænger efterhånden lidt løst..), men det gjorde ingen forskel, stadig samme fejl
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:48 #44
SELECT * FROM Spm NATURAL LEFT JOIN Svar WHERE Svar.BrugerID=<etid>

Det bliver til

SELECT * FROM topic topic_spm LEFT JOIN topic topic_Svar
ON topic_spm.id = topic_svar.reference
WHERE topic_svar.BrugerID=<etid>

...så jo. Det skal der fantasi til at forestille sig. Hvis jeg har taget fejl af det du ville, så skriv en hel SQL-sætning.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:49 #45
kroger>>> Der mangler et komma forand count.
Avatar billede netro Nybegynder
24. juli 2003 - 00:51 #46
Select s.SpmID From Spm s Left Join Svar v Where v.BrugerID = 123 Group By s.SpmID;
Avatar billede kroger Nybegynder
24. juli 2003 - 00:52 #47
Så blev fejlen til:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'ORDER'.

Og koden er nu:

SELECT * FROM (SELECT topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst, count(topic2.id) AS topic_count FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference GROUP BY topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst) ORDER BY topic_count DESC
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:53 #48
Select s.id From topic s Left Join topic v Where v.BrugerID = 123 Group By s.id;
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:55 #49
Prøv at køre subselect-sætningen alene. Altså

SELECT topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst, count(topic2.id) AS topic_count FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference GROUP BY topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, topic1.tekst
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:56 #50
netro>>> Din sætning har iøvrigt en fejl for der mangler en join-betingelse, men det er en mindre detalje. Min sætning bliver til

Select s.id From topic s Left Join topic v on s.id = v.reference Where v.BrugerID = 123 Group By s.id;
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 00:59 #51
...hvis man antager at den skal med.
Avatar billede kroger Nybegynder
24. juli 2003 - 00:59 #52
Så får jeg denne her:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The text, ntext, and image data types cannot be used in a GROUP BY clause.

Kolonnen "tekst" er af typen ntext (For at kunne få plads til lange indlæg)
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 01:01 #53
Det er dælme noget skidt.
Avatar billede kroger Nybegynder
24. juli 2003 - 01:02 #54
Kan jeg evt. bruge en anden felttype til det formål, som GROUP BY kan klare?
Avatar billede netro Nybegynder
24. juli 2003 - 01:05 #55
Ja, den smuttede, men du kan formentlig tænke dig til det sidste.
Nu vil jeg sige tak for diskusionen og lade være med at spamme krogers spørgsmål yderligere. Vi bliver alligevel aldrig enige om dette.

PS: Nu du selv nævner det offentligt, vil jeg være tilbøjelig til at give dig ret mht. sidste linie ;) http://www.exp.dk/bruger.phtml?navn=_darkstar_
Avatar billede kroger Nybegynder
24. juli 2003 - 01:06 #56
Hæhæ, det er da hyggeligt nok med en lille battle ;)
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 01:06 #57
Denne her burde give dig en liste af ID'er med antal indlæg - sorteret i faldende rækkefølge. Jeg når ikke længere idag. Er træt. Dynerne kalder.

SELECT topic1.id, COUNT(topic2.id) AS topic_count
FROM topic topic1 LEFT JOIN topic topic2 ON topic1.id = topic2.reference
GROUP BY topic1.id
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 01:09 #58
netro>>> jeg kan ikke tænke mig til "det sidste". Faktisk aner jeg ikke hvad du skriver om. Jeg kan *bevise* at du ikke kan noget som jeg ikke kan. Derfor er det lidt svært at "tænke sig til det sidste".

Men tak for denne gang.
Avatar billede kroger Nybegynder
24. juli 2003 - 01:09 #59
Jeg prøver. Nu har jeg også fået en del at arbejde ud fra. Jeg siger mange tak for hjælpen, du får pointene får den store hjælp det er jeg virkelig glad for.

Godnat
Avatar billede kroger Nybegynder
24. juli 2003 - 01:09 #60
får = for
Avatar billede netro Nybegynder
24. juli 2003 - 01:11 #61
Så skal jeg tænke for dig.

Select s.SpmID From Spm s Left Join Svar v On s.SpmID = v.SpmID Where v.BrugerID = 123 Group By s.SpmID;

Over and out...
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 12:33 #62
netro>>> Nu er vi vidst to der er arrogante...

En hver forespørgsel du måtte finde på, kan omskrives ved at bruge følgende regler:

1. Omskriv feltnavnene så de passer ("SpmID" bliver til "id" hvis det er Spm-tabellen der refereres til og så videre).
2. Omskriv "Spm" til "topic Spm".
3. Hægt følgende betingelser på: "Spm.reference = 0" og "Svar.reference <> 0".

Jeg glemte punkt tre i mine eksempler igår, men de er lige til at hægte på.

...så din sætning fra igår bliver til

Select s.id From topic s Left Join topic v On s.id = v.reference Where v.BrugerID = 123 and s.reference = 0 and v.reference <> 0 Group By s.id;

Jeg venter stadigvæk på den SQL-sætning som du påstår der findes, som man ikke kan formulere med een tabel.

For at fortsætte ud af arrogancesporet: jeg har arbejdet med SQL siden 1995 og fik 13 i skriftlig eksamen i databaser på Universitetet.

Overbevis mig.
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 12:34 #63
Punkt 2 ovenfor mangler [...] og "Svar" til "topic Svar".
Avatar billede _darkstar_ Nybegynder
24. juli 2003 - 12:54 #64
kroger>>> Tak for points.
Avatar billede netro Nybegynder
25. juli 2003 - 04:50 #65
"Jeg venter stadigvæk på den SQL-sætning som du påstår der findes, som man ikke kan formulere med een tabel."

Inden du selvforelsker dig helt, så prøv lige at læse tråden én gang til og vis mig stedet, hvor jeg påstår ovenstående.

Det oprindelige spørgsmål er, om det er godt eller dårligt databasedesign at hælde det hele ned i samme tabel. Jeg mener stadig, det er bedre at opdele data, som jeg illustrerede. Men du plaprer løs og forsøger at overbevise mig om, du kan gøre det samme som mig med én tabel. Og hvor vil du hen med det? Jeg synes, det ville være mere relevant, hvis du kunne overbevise mig om, at din løsning er så meget bedre, at du kan tillade dig at betegne min som direkte "dårlig". Du må gerne citere fra dine før omtalte bøger, hvis du lyster.
Avatar billede _darkstar_ Nybegynder
25. juli 2003 - 09:56 #66
netro>>> "Så lad mig spørge dig, hvordan du f.eks. vil udtrække de spørgsmål/tråde, hvor en bruger deltager uden en subselect?"
Avatar billede _darkstar_ Nybegynder
25. juli 2003 - 10:00 #67
...og så er det jo lidt pudsigt at du har leget med indtil nu i stedet for at pointere at det ikke handlede om hvad der kunne lade sig gøre.

Men træk da endelig bare i land.
Avatar billede netro Nybegynder
25. juli 2003 - 16:04 #68
Jvf. tabellerne fra 24/07-2003 00:03:15), laver jeg et udtræk af de spm., hvor en bruger deltager med en join:

Select s.SpmID From Spm s Left Join Svar v On s.SpmID = v.SpmID Where v.BrugerID = 123 Group By s.SpmID;

Jeg har ikke så meget at trække i land. Jeg kunne blot godt tænke mig at se, hvordan du laver det tilsvarende udtræk med brug af én SQL-sætning i en database, der ikke understøtter subselects og views.
Avatar billede _darkstar_ Nybegynder
25. juli 2003 - 16:13 #69
netro>>> Så kom der endelig kød på bordet.

Din forespørgsel bruger et join. Det gør min også. Her er den:

SELECT s.id
FROM topic s LEFT JOIN topic v On s.if = v.reference
WHERE v.BrugerID = 123
  AND s.reference = 0
  AND v.reference <> 0
GROUP BY s.id;

Hvilket iøvrigt er identisk med det jeg skrev i mit svar 24/07-2003 12:33:35.

Læser du ikke hvad jeg skriver?
Avatar billede _darkstar_ Nybegynder
25. juli 2003 - 16:16 #70
...og hvad angår om det er godt eller dårligt databasedesign iøvrigt, mener jeg ikke at det er en diskussion vi kan tage her. Jeg mener at een tabel er det rigtige, men for min skyld skal du være velkommen til at putte hvert spørgsmål i en separat tabel.

Du kan eventuelt tage et kig på mine argumenter imod dit design og starte med at svare på dem.

(Punktlisten højere oppe.)
Avatar billede netro Nybegynder
25. juli 2003 - 16:38 #71
Havde ikke set det svar - men ja, det var det, jeg ville vide.
Generelt synes jeg, man bør undgå for mange tomme felter. Derudover synes jeg rent designmæssigt, det er pænere at adskille data. Hvis svarene også kræver en overskrift, er problemet ikke væsentligt. Men lad os sige, at brugeren der opretter spørgsmålet også skulle angive navn, adresse og e-mail. Ville du så stadig hælde det ned i samme tabel, hvor alle svar-felterne efterlades tomme i disse kolonner?
Avatar billede _darkstar_ Nybegynder
25. juli 2003 - 19:26 #72
netro>>> Jamen så går jeg ud fra at du er overbevist nu.

Hvad angår databasedesign så er det jo en afvejning af "renhed" og brugervenlighed overfor programmøren. Et enkelt felt som man blot undlader at bruge synes jeg bestemt ikke er grund nok til at dele ind i to tabeller. Konsekvensen er jo at man skal skrive en pæn bunke kode som tager højde for den nye tabel, som man har lavet. I dette tilfælde er det specielt grelt fordi at den ene tabel vil tjene til at holde øverste niveau i en skov, hvor de næste niveauer ligger i en separat tabel. Det kommer til at give noget temmeligt grim kode.

Desuden er to tabeller der ligner hinanden så meget altså også tegn på dårligt databasedesign.

Hvis der var nogle data som dem du beskriver (det er bare ikke noget godt eksempel i denne kontekst, da der jo er et BrugerID, som man må antage bruges til det samme), så er jeg enig med dig - det ville ikke blive pænt. Til gengæld er det altså heller ikke pænt at putte navn, adresse og email på de enkelte indlæg - med mindre at brugerne af systemet har en særlig interesse i at vide præcis hvilken mailadresse den enkelte spørgsmål-stiller havde da han stillede spørgsmålet.... :-|

Så til din kommentar om godt eller dårligt design ville jeg nok sige at det pæneste ville være at lave en tabel til brugere og en tabel til spørgsmål/svar - ligesom kroger har gjort det nu.

Hvis det ikek var email, navn og adresse, men måske nogle oplysninger som havde noget direkte med spørgsmålet at gøre, f. eks. hvornår det skulle besvares, hvilken kategori det tilhørte og den slags, så ville jeg begynde at overveje at hælde dem i en separat tabel.
Avatar billede netro Nybegynder
26. juli 2003 - 05:51 #73
Jeg havde faktisk ikke overvejet muligheden med at joine tabellen med sig selv, så ja - det er indlysende, at det giver de samme muligheder for udtræk.
Det var et lidt dårligt eksempel, jeg kom med. For selvfølgelig vil man hælde brugerrelaterede oplysninger i tabellen med brugere. Et bedre eksempel ville f.eks. være kategori og relevans for spørgsmålet. Men jeg kunne dog stadig godt tænke mig at se uddrag fra de bøger, du hentyder til, da denne form for design så vidt jeg husker ikke er i overensstemmelse med de fire normaliseringstrin. Jeg har arbjedet med SQL og databaser i 5 år og er altid blevet "opdraget" til at opdele data på en så logisk og overskuelig struktur som muligt. Derfor interessere det mig, hvis du kan fremvise noget konkret dokumentation for dine egen udsagn. Ikke at det nødvendigvis vil ændre min opfattelse og personlige overbevisning, men det vil give mig lidt tankestof.
Avatar billede kroger Nybegynder
27. juli 2003 - 18:49 #74
Lige for at strække den darkstar vil jeg høre om du kan hjælpe mig med en sidste ting, du kan evt få nogle xtra point hvis det er.
Jeg har nu nået så langt at den nu sortere efter dem der har flest besvarelser, og det er jo ikke helt korrekt. Og når man laver et nyt indlæg ryger det helt nederst, og det er jo absolut heller ikke meningen.
Efter jeg har været begravet i diverse bøger og artikler har jeg stadig ikke fået kringelt den, mit problem er nok at jeg ikke helt forstår koden, så hvis du evt. kunne forklare lidt om hvad der sker, kunne jeg selv arbejde videre med den selv.

Den kode jeg er endt med indtil videre er:

SELECT topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift, count(topic2.id) AS topic_count FROM musik_topic topic1 LEFT JOIN musik_topic topic2 ON topic1.id = topic2.reference WHERE topic1.forumid ='" & Request.Querystring("fid") & "' AND topic1.reference = 0 GROUP BY topic1.id, topic1.forumid, topic1.reference, topic1.dato, topic1.klokken, topic1.navn, topic1.overskrift ORDER BY topic_count DESC;

Det er specielt GROUP BY og din LEFT JOIN jeg ikke helt forstår.

På forhånd tak
Avatar billede kroger Nybegynder
31. juli 2003 - 15:09 #75
Jeg fik selv klaret den, dog på en anden måde. Hvis det ellers interressere kan jeg lige hvise hvad jeg har gjort.

Jeg oprettede et xtra felt i tabellen der hedder sortering.

Når der oprettes et nyt indlæg smides indlæggets id i feltet sortering.
Når der laves en besvarelse opdatere den det originale indlægs sortering med besvarelsens id.
Og ved visnig er det "order by sortering desc"

Så simpelt, og alligevel skulle det tage 400 år før jeg kom i tanke om 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