Avatar billede pissed_squirrel Nybegynder
10. februar 2009 - 14:16 Der 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.
Avatar billede arne_v Ekspert
10. februar 2009 - 14:21 #1
noget lignende:

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
Avatar billede pissed_squirrel Nybegynder
10. februar 2009 - 19:29 #2
Hej Arne

Desværre virker det ikke det du har foreslået

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

Giver det mere mening nu?
Avatar billede arne_v Ekspert
10. februar 2009 - 21:12 #3
proev:

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
Avatar billede pissed_squirrel Nybegynder
10. februar 2009 - 21:24 #4
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
Avatar billede pissed_squirrel Nybegynder
10. februar 2009 - 21:58 #5
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

Tak på forhånd!
Avatar billede sn0wflake Nybegynder
11. februar 2009 - 02:22 #6
Har du kigget på UNION? Læs om den på http://www.w3schools.com/sql/sql_union.asp hvor der er masser af info om SQL.
Avatar billede arne_v Ekspert
11. februar 2009 - 03:19 #7
Jeg forstår stadig ikke din logik.

Vil:

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

give det antal du ønsker ?
Avatar billede pissed_squirrel Nybegynder
13. februar 2009 - 15:37 #8
Hej Arne

Undskyld at jeg ikke er vendt tilbage noget før.

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.

Skriv endelig hvis jeg skal uddybe.

Tak på forhånd!
Avatar billede arne_v Ekspert
15. februar 2009 - 05:11 #9
(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.
Avatar billede pissed_squirrel Nybegynder
18. februar 2009 - 20:31 #10
Jeg har løst mit problem programmatisk

Hvis du vil have point for din tilmådighed og din hjælp, så smid et svar
Avatar billede arne_v Ekspert
19. februar 2009 - 01:34 #11
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