10. februar 2009 - 14:16Der er
10 kommentarer og 1 løsning
Join og Join og join?
Hej Eksperter
Jeg skal udtrække data fra 3 tabeller.
CREATE TABLE `iw_program` ( `ID` int(10) NOT NULL auto_increment, `Dato` date NOT NULL, `Year` int(10) NOT NULL, `Month` int(10) NOT NULL, `Day` int(10) NOT NULL, `3minutes` varchar(255) collate latin1_general_ci NOT NULL, `Monthletters` varchar(255) collate latin1_general_ci NOT NULL, `Poemoftheday` varchar(255) collate latin1_general_ci NOT NULL, `Program` tinytext collate latin1_general_ci NOT NULL, `Incharge` varchar(255) collate latin1_general_ci NOT NULL, `Location` tinytext collate latin1_general_ci NOT NULL, `Speakers` int(10) NOT NULL default '0', UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
------
CREATE TABLE `iw_users` ( `ID` int(10) NOT NULL auto_increment, `Navn` varchar(255) collate latin1_general_ci NOT NULL, `Brugernavn` varchar(255) collate latin1_general_ci NOT NULL, `Kodeord` varchar(255) collate latin1_general_ci NOT NULL, `Userlevel` varchar(255) collate latin1_general_ci NOT NULL default 'Normal', `Adresse` varchar(255) collate latin1_general_ci NOT NULL, `Postnrby` varchar(255) collate latin1_general_ci NOT NULL, `Email` varchar(255) collate latin1_general_ci NOT NULL, `Telefon` varchar(255) collate latin1_general_ci NOT NULL, `TelefonAlt` varchar(255) collate latin1_general_ci NOT NULL, `Mobil` varchar(255) collate latin1_general_ci NOT NULL, `MobilAlt` varchar(255) collate latin1_general_ci NOT NULL, `Status` varchar(255) collate latin1_general_ci NOT NULL, `BirthDay` int(10) NOT NULL, `BirthMonth` int(10) NOT NULL, `BirthYear` int(10) NOT NULL, `OptagelseMonth` int(10) NOT NULL, `OptagelseYear` int(10) NOT NULL, `Civilstatus` varchar(255) collate latin1_general_ci NOT NULL, `Frameld` int(2) NOT NULL default '1', UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
------
CREATE TABLE `iw_program_subscribers` ( `ID` int(10) NOT NULL auto_increment, `UserID` int(10) NOT NULL, `UserSubscription` int(2) NOT NULL, `Comment` varchar(255) collate latin1_general_ci NOT NULL, `Guests` int(10) NOT NULL, `ProgramID` int(10) NOT NULL, UNIQUE KEY `ID` (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
Problemet ligger i at jeg skal hente data fra 3 tabeller, men det er ikke sikkert der er noget i iw_program_subscribers
Det skal bruges til at liste alle de programmer som der er, og så skrive hvor mange personer der er tilmeldt det enkelte program. En bruger kan som standard stå således at personen skal aktiv framelde sig eller aktiv tilmelde sig.
Hvis iw_users.Frameld er 1 så skal personen aktivt framelde sig til de eller det program som personen ikke gider deltage i.
Problemet er derfor at personen ikke nødvendigvis har noget info stående i iw_program_subscribers. Der står kun noget i den fra den enkelte person hvis denne har været inde og tilmelde en gæst og/eller tilmelde/framelde sig selv.
Egentlig kunne jeg forestille mig at der måske skulle være en SELECT inde i en SELECT, men da jeg aldrig har prøvet det før, så ved jeg ikke hvordan det lige skal gøres.
Så jeg håber i kan guide mig i den rigtige retning.
På forhånd tak.
PS. skriv endelig hvis jeg skal uddybe noget eller forklare noget på en anden måde.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
SELECT iw_program.program,COUNT(*) FROM iw_program LEFT JOIN iw_program_subscribers ON iw_program.id=iw_program_subscribers.programid GROUP BY iw_program.program
Der bliver returneret 1 ved alle programmer, hvis der ikke ikke står noget i iw_program_subscribers
Hvis der er 30 personer i databasen, og de alle sammen står til at skulle aktivt framelde (1) og de ikke har tilmeldt nogle gæster, så skal den jo returnere 30 ud for det enkelte program
Hvis 1 der imod står til at skulle aktivt tilmelde sig, så skal den jo returnere 29
SELECT iw_program.program,COUNT(iw_program_subscribers.programid) FROM iw_program LEFT JOIN iw_program_subscribers ON iw_program.id=iw_program_subscribers.programid GROUP BY iw_program.program
Den giver 0 ved de programmer der ikke står noget ved inde i iw_program_subscribers, og den burde jo give 30 da det er antal af medlemmer i databasen og de alle pt står til aktiv framelding
Man kan vel groft sagt egentlig sige at jeg skal have blandet de her SQL sætninger:
SELECT COUNT(*) FROM iw_users WHERE frameld = '1'
SELECT * FROM iw_program
SELECT * FROM iw_program_subscribers
Det var derfor jeg tænkte at der måske skulle bruges 3 joins eller en SELECT inde i en SELECT, men da jeg aldrig har lavet sådan noget før, ved jeg ikke hvor jeg skal starte og hvor jeg skal slutte =( _____
Vis alle programmer, og vis samtidig hvor mange der er tilmeldt og deres gæster der er til det enkelte program _____
Du må endelig sige hvis du ikke forstår noget, eller jeg skal uddybe mine tabeller
SELECT iw_program.program,(SELECT COUNT(*) FROM iw_users)-COUNT(iw_program_subscribers.programid) FROM iw_program LEFT JOIN iw_program_subscribers ON iw_program.id=iw_program_subscribers.programid GROUP BY iw_program.program
Den sidste SQL sætning du er kommet med, kan ikke bruges for den tager antal bruger og trækker det antal programid der findes i iw_program_subscribers.
Den sætning virker jo kun hvis alle personer står til aktiv framelding.
Hvis en person står til aktiv tilmelding bliver personen talt med og så bliver personen trukket fra når personen melder sig til.
Hvis en person vil tilføje en gæst bliver der også sat et 1 tal i iw_program_subscribers.UserSubscription for at personen selv er tilmeldt foruden for det antal gæster personen tilmelder til programmet (iw_program_subscribers.Guests).
Hvis personen ændre sig til frameldt så bliver 1 ændret til 0 i iw_program_subscribers.UserSubscription. Men gæsterne er stadig tilmeldt, hvilket vil sige at man kan tilmelde gæster selv om man ikke selv skal med.
Så vi skal egentlig have fundet ud af hvilke brugere der er står til aktiv tilmelding og så se om de har tilmeldt sig, samtidig med at vi skal finde ud af hvem der står til aktiv framelding og så se om de har frameldt sig. Og der skal så indregnes de gæster der er tilmeldt.
(SELECT iw_program.program,(SELECT COUNT(*) FROM iw_users WHERE frameld=1)-COUNT(iw_program_subscribers.programid) FROM iw_program LEFT JOIN iw_program_subscribers ON iw_program.id=iw_program_subscribers.programid WHERE frameld=1 GROUP BY iw_program.program) UNION (SELECT iw_program.program,COUNT(iw_program_subscribers.programid) FROM iw_program LEFT JOIN iw_program_subscribers ON iw_program.id=iw_program_subscribers.programid WHERE is_users.frameld=0 GROUP BY iw_program.program)
mangler stadig gæster.
Jeg tror at du vil være bedre stillet ved at ændre den tabel struktur.
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.