Avatar billede labisama Nybegynder
03. januar 2010 - 18:45 Der er 8 kommentarer og
1 løsning

Join driller

Hej med jer!

Jeg skal lave et udtræk fra databasen med top 20 brugere.

Den ene tabel indeholder al informationen, samt et unikt brugerid (uid), og den anden tabel (users) indeholder brugernavnet tilhørende uid, som jeg gerne vil have trukket med ud.

Jeg har prøvet sådan her, uden held:

$results = db_query("SELECT COUNT(node.nid) as hits, node.uid FROM node LEFT JOIN users ON node.uid=users.name WHERE node.type = 'file' GROUP BY node.uid ORDER BY node.hits DESC");

      while ($item = db_fetch_array($results)) {
        $output[] = l($item['name'], 'sdgsdg/'. $item['uid']);
      }

Hvad gør jeg galt?
Avatar billede repox Seniormester
03. januar 2010 - 18:57 #1
Kunne du ikke komme med et par eksempler på data fra dine tabeller?
Avatar billede labisama Nybegynder
03. januar 2010 - 19:05 #2
Tabel node:

nid | title | uid |type

Tabel users:

uid | name
Avatar billede repox Seniormester
03. januar 2010 - 19:13 #3
Jo, jo, men hvad kan tabellerne indeholde? Og hvad er kriteriet for at få top tyve?
Det er lidt svært at tyde ud fra en SQL streng der ikke virker.
Avatar billede labisama Nybegynder
03. januar 2010 - 19:18 #4
Top 20 er listen over hvilke brugere der har oprettet flest "node".

Tabellen "users" indeholder bare brugernes oplysninger.

Tabellen "nodes" indeholder altså tekst osv.
Avatar billede alphabits Nybegynder
03. januar 2010 - 19:44 #5
Du joiner på:

node.uid=users.name

skal det ikke være

node.uid=users.uid
03. januar 2010 - 19:47 #6
repox har ret, du har ikke gjort det let at blive hjulpet.  Du spoerger "Hvad goer jeg galt?"  Men du fortaeller ikke meget om hvad du goer overhovedet.  Tre observationer til at begynde med:

(1)  Criterium for at hoere til top 20 brugere er vel antal hits.  Saa dit query skal velsagtens ende med LIMIT 30.

(2)  Du bruger i din query overhovedet ingen oplysninger i tabellen users.  Hvis det var meningen at faa navnet paa de top 20 users skulle din query vaere noget i denne henretning:

SELECT COUNT(node.nid) as hits, user.name
FROM node
LEFT JOIN users ON node.uid=users.uid
WHERE node.type = 'file'
GROUP BY hits ORDER BY hits DESC

eller hvis du vil have baade uid og name skal foerste linie nok vaere:

SELECT COUNT(node.nid) as hits, node.uid, user.name

Koden er et langt stykke vej gaetvaerk paa grund af manglende oplysninger.

(3) Din php kode fanger ingen oplysninger om antal hits hvilket jeg vil gaette paa at du vil oenske.  Du skal nok have saadan noget som:

while ($item = db_fetch_array($results))
$output[] = $item['name'], 'sdgsdg/'. $item['uid'] . " - " $item['name'];

og saa nok noget lignende:

foreach($i = 0; $i < count($output); $i++)
echo $output[$i] . "<br/>";

Det er hurtigt lavet uden at teste noget fordi jeg ikke har meget at teste. Giv dine kommentarer til ovenstaaende.  Hvis du allerede har skrevet kode men som fejlelr saa giv os koden og fortael hvad koden giver og hvad koden skulle have givet.
03. januar 2010 - 19:47 #7
Det kom afsted mens repox lavede et indlaeg med delvis de samme observationer.
Avatar billede labisama Nybegynder
03. januar 2010 - 20:12 #8
Virkede med nogle små tilrettelser.

Smid et svar!
03. januar 2010 - 20:26 #9
Svar
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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