Avatar billede supermand69 Nybegynder
01. februar 2005 - 17:56 Der er 8 kommentarer og
1 løsning

query med flere joins

Jeg har lavet en dabat, men der skal være mulighed for at smide en attribut på hver tråd: locked, sticky

min query:
SELECT debate.id, IFNULL(MAX(debate2.time), debate.time) AS last_time
    FROM $DB.debate debate
    LEFT JOIN $DB.debate debate2 ON debate.id=debate2.thread_id && debate2.reply_id!=0
    WHERE debate.topic='$_GET[tab]' && debate.reply_id=0
    GROUP BY debate.thread_id
    ORDER BY last_time DESC

min struktur:
CREATE TABLE `debate` (
  `id` mediumint(7) NOT NULL auto_increment,
  `topic` tinyint(1) NOT NULL default '0',
  `thread_id` mediumint(7) NOT NULL default '0',
  `reply_id` mediumint(7) NOT NULL default '0',
  `user_id` smallint(5) unsigned NOT NULL default '0',
  `time` int(10) NOT NULL default '0',
  `subject` varchar(40) NOT NULL default '',
  `msg` text NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=18 ;

Jeg ved så ikke hvilken måde at "integrere" disse attributer?

Hvis jeg f.eks. laver en sticky attrib på en tråd skal der smides et timestamp med som angiver hvornår den igen skal ophøre med at være sticky :) Jeg ved ikke om jeg skal lave en seperat table til dette og så lave join eller bare lave 2 nye rækker i den eksisterende debate table?

eks.
thread_id | lock | sticky

Jeg ved heller ikke lige hvordan jeg skal lave min query, så alle sticky tråde bliver trukket ud først?
Avatar billede arne_v Ekspert
01. februar 2005 - 17:59 #1
max. 1 attribut per tråd => samme tabel
mulighed for flere attributter per tråd => ny tabel
Avatar billede arne_v Ekspert
01. februar 2005 - 18:00 #2
du sorterer bare på sticky feltet så de rigtige kommer først
Avatar billede supermand69 Nybegynder
02. februar 2005 - 21:59 #3
oki... men jeg ved ikke helt hvordan jeg skal lave min query? jeg skal have lavet en slags if-statement mere i select

$sql = "SELECT debate.id, IFNULL(MAX(debate2.time), debate.time) AS last_time, debate_attrib.stick
    FROM ($DB.debate debate
        LEFT JOIN $DB.debate debate2 ON debate.id=debate2.thread_id && debate2.reply_id!=0)
    LEFT JOIN $DB.debate_attrib debate_attrib ON debate.id=debate_attrib.thread_id
    WHERE debate.topic='$_GET[tab]' && debate.reply_id=0
    GROUP BY debate.thread_id
    ORDER BY debate_attrib.stick DESC, last_time DESC";

det skal være sådan at det kun hvis debate_attrib.stick>0 at den skal sortere efter den :)
Avatar billede arne_v Ekspert
02. februar 2005 - 22:02 #4
0 kommer sidst ved ORDER BY DESC, så er det ikke fint nok ?
Avatar billede supermand69 Nybegynder
02. februar 2005 - 22:05 #5
jeg har lavet en ny table

CREATE TABLE `debate_attrib` (
  `thread_id` mediumint(7) NOT NULL default '0',
  `lock` int(10) NOT NULL default '0',
  `stick` int(10) NOT NULL default '0',
  PRIMARY KEY  (`thread_id`)
) TYPE=MyISAM;

hvis jeg bare sætter lock til noget bliver den også udtrukket fra min query først :(
Avatar billede supermand69 Nybegynder
03. februar 2005 - 15:28 #6
kan du ikke hjælpe? :(

jeg har prøvet at smide denne op i min select men får bare en fejl
IF(debate_attrib.stick<1, 0) AS stick
Avatar billede supermand69 Nybegynder
03. februar 2005 - 18:14 #7
hov... den skal sortere efter debate_attrib.stick så længe den er større end 0
Avatar billede supermand69 Nybegynder
03. februar 2005 - 19:23 #8
har fået det til at virke nu :)

lav et svar så du kan få points

$sql = "SELECT debate.id, IFNULL(MAX(debate2.time), debate.time) AS last_time, IFNULL(debate_attrib.stick, 0) AS stick
    FROM ($DB.debate debate
        LEFT JOIN $DB.debate debate2 ON debate.id=debate2.thread_id && debate2.reply_id!=0)
    LEFT JOIN $DB.debate_attrib debate_attrib ON debate.id=debate_attrib.thread_id
    WHERE debate.topic='$_GET[tab]' && debate.reply_id=0
    GROUP BY debate.thread_id
    ORDER BY stick DESC, last_time DESC";
Avatar billede arne_v Ekspert
03. februar 2005 - 19:27 #9
ok
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
Computerworld tilbyder specialiserede kurser i database-management

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