Avatar billede Klaphattens Novice
25. juni 2012 - 13:13 Der er 17 kommentarer og
1 løsning

Random udtræk fra table i database

Jeg kan ikke rigtigt gennemskue hvordan denne lille opgave laves nemmest. Det skal bruges til en konkurrence hvor flere grupper af 2 personer skal klare nogle opgaver. Opgaverne har jeg samlet i en tabel(der hedder opgaver), ved ikke om i forstår min skitse af tabellen:

-id-opgave-gruppe-p1-p2-ok-igang-
-1-Opgave1-1-0-0-0-0-
-2-Opgave2-1-0-0-0-0-
osv.

Når grupperne logger ind med deres bruger skal de se 2 tilfælde opgaver. Men opgaverne må ikke skifte hvis ikke de er løst og siden bliver genindlæst.

Så når siden med opgaverne åbnes, skal det forløbe sådan (lige hurtigt skrevet):
1.)der tjekkes om der er 2 opgaver hvor igang=1

2.)der udvælges 2 opgaver hvor ok=0, igang=0 og gruppe=$gruppenr og her ændres igang fra 0 til 1

3.)der udskrives de 2 opgaver hvor igang=1 og ok=0 og gruppe=$gruppenr

4.)hvis der ikke er flere opgaver hvor igang=0, ok=0 og gruppe=$gruppenr, betyder det at ok=1 i alle opgaver. Så vil jeg gerne at den erstatter 1 med 0 i alle ok'er hvor gruppe=$gruppenr

Jeg skal nok bare gerne have hjælp til at lave noget der kan køre de 4 step igennem. Så kan jeg selv få legen til at køre.
Avatar billede inteeeL Nybegynder
25. juni 2012 - 14:06 #1
Det er i mine øjne ikke den bedste struktur, du har af mht. tabellerne. Jeg ville nok have lavet tre adskilte tabeller; "Grupper", "Opgaver" og "Log". Opgaver og grupper kombineres, når opgaverne skal laves. Log bruges til at registrere, når en gruppe har valgt 2 opgaver; når disse opgaver er løst, kan opgave-statusserne nulstilles (igang=0, ok=0, gruppe=0) så andre kan vælge opgaven, men i stedet registreres der i loggen, at gruppe nr x har løst opgave x og x. Du må næsten have en tabel til brugerne/grupperne, siden logger ind. Kan du vise den?

1.)der tjekkes om der er 2 opgaver hvor igang=1 / Mener du ikke, at der tjekkes, om der er to opgaver, hvor i gang er lig med 0? Herefter udvælges disse to opgaver, hvor i gang ændres til 1, som du selv nævner. Når opgaven er færdig/løst, ændres ok til 1.

Vil de sige, at du når en opgave er valgt, skal andre grupper ikke kunne vælge samme opgave? Det kan man godt tillade, hvis man har log-tabellen med, men det kan jo være, det er hensigten, at to grupper ikke sidder med samme opgave.
Avatar billede olebole Juniormester
25. juni 2012 - 14:11 #2
<ole>

Der er nok ikke nogen, der har lyst til at spilde tid på at give dig 'den nemmeste' løsning. Det, du skal bruge, må være 'den bedste'. Det er somregel to meget forskellige ting  *o)

Du beskriver et check i #1. Hvad skal der ske, hvis betingelsen er opfyldt - og hvad skal der ske, hvis den ikke er?

/mvh
</bole>
Avatar billede olebole Juniormester
25. juni 2012 - 14:13 #3
- og trin to har inteeeL taget hul på: En mere hensigtsmæssig struktur. Jeg ville dog stadig gerne have helt styr på, hvad du mener  =)
Avatar billede Klaphattens Novice
25. juni 2012 - 14:29 #4
Altså flere hold må godt få tildelt samme opgave. Bare det sker ved et tilfælde, for så er chancen meget lille for at 5 hold har samme opgave.

"1)der tjekkes om der er  2 opgaver hvor igang=1"
Der manglede lige at der også skulle være "gruppe=$gruppenr"

Jeg ved ikke hvilken struktur der er bedst. Det med at lave en log er ikke dumt. Min struktur er nok dum da hver opgave står 5 gange i databasen bare med forskelligt gruppenr i gruppe kolonnen.

Altså der tjekkes om ens hold har 2 opgaver i gang.
Hvis ikke trækkes det antal opgaver der mangler (første gang mangler der jo 2 ellers skulle der kun mangle 1)
Hvis der ikke er flere opgaver der er uløst, så nulstilles registreringen af de løste opgaver, så de kan trækkes igen.

p1 og p2 (person1 og person2) er ikke forklaret. Men det er hvis den ene i gruppen mener at opgaven er løst så sættes der "1" i p1 og så skal p2 godkende at opgaven er løst ved at sætte p2="1" og derved ok="1". Hvis ikke han/hun godkender det vil p1 ændres tilbage til "0". Men det kan godt være en dum måde jeg har tænkt mig frem til.
Avatar billede Klaphattens Novice
25. juni 2012 - 14:53 #5
#2 Den bedste er også det jeg søger.

Jeg har arbejdet med automation i nogle år. og for at lave PLC programmer tegner vi os igennem det:

Men jeg kan godt se min struktur er meget ringe, og kan gøres meget bedre så det er jeg åben overfor.

Jeg prøver at stille det bedre op

1.)første person på et hold logger ind første gang -> 2 opgaver bliver tilfældigt til hans hold.

2.)opgaverne bliver vist på opgave siden.

3.)den ene trykker "opgave fuldført" -> den anden kan afvise (så nulstilles "opgave fuldført" -> hvis dan anden godkender at opgaven er fuldført -> Logges opgaven som fuldført og en ny opgave gives holdet.

4.)holdene skal igennem alle opgaverne -> når holdet får tildelt den sidste opgave bliver alle løst opgaver igen gjort tilgængelige. og så køre man opgaverne igennem igen. og igen. og igen... osv

Var det en bedre forklaring? jeg har undgået at bruge min struktur da den er dum. jeg har bare forklaret hvordan det skal køre
Avatar billede inteeeL Nybegynder
25. juni 2012 - 14:55 #6
Min struktur er nok dum da hver opgave står 5 gange i databasen bare med forskelligt gruppenr i gruppe kolonnen. <- Det var nemlig det, jeg tænkte - og det er der ingen grund til, hvis du bygger tabellerne anderledes op.

Skal der være to opgaver tilgængelige hver gang, eller er det okay, hvis der kun er 1 opgaver, der endnu er uløst. Når denne så er løst, kan registreringerne nulstilles. Eller hvad? :-)

p1 og p2 (person1 og person2) er ikke forklaret. Men det er hvis den ene i gruppen mener at opgaven er løst så sættes der "1" i p1 og så skal p2 godkende at opgaven er løst ved at sætte p2="1" og derved ok="1". Hvis ikke han/hun godkender det vil p1 ændres tilbage til "0". Men det kan godt være en dum måde jeg har tænkt mig frem til. <- De to personer sidder altså ikke og laver opgaverne sammen? I det tilfælde kan de fremgangsmåde sagtens fungerer. Der er dog ingen grund ti lat ændre p1 tilbage til 0, fordi p2 ikke godkender det.

Har du noget kode, du på nuværende tidspunkt kan vise?
Avatar billede Klaphattens Novice
25. juni 2012 - 15:04 #7
#6 der skal være 2 hele tiden. du skrev nok imens jeg lavede #5 men der beskrev jeg at når sidste opgave vælges, nulstilles de opgaver der er løst og kan derved bruges igen.

Nej er ikke startet med at kode noget endnu. andet end at jeg har et bruger system hvor jeg har opdelt brugerne i grupper. men det har jo som sådan ikke noget med dette at gøre. ville først have opgave tildelingen til at virke. så kunne jeg med min stuktur godt få noget til at virke... troede jeg.
Avatar billede inteeeL Nybegynder
25. juni 2012 - 15:51 #8
Hvis du lige gider vise, hvordan dit brugersystem ser ud (og hvordan brugerne er opdelt samt tabellen herfor), kan jeg herefter vise, hvordan tabel-strukturen kan se ud.
Avatar billede Klaphattens Novice
25. juni 2012 - 16:10 #9
Hvis du lige gider vise, hvordan dit brugersystem ser ud (og hvordan brugerne er opdelt samt tabellen herfor)
Er lidt i tvivl om hvor meget og hvilken del af brugersystemet du vil se. men tabel til bruger ser ud som følger:
-id-navn-kode-mail-oprettelse-medlemstype-gruppenr-

Jeg har dog overvejet at lave en gruppe tabel, men med min struktur fandt jeg det nemmest at lave det som jeg har det nu.
Jeg er dog villig til at ændre det hvis det er bedre.
Avatar billede inteeeL Nybegynder
25. juni 2012 - 16:40 #10
Kan jeg se den del, hvor grupperne oprettes/opdeles, eller hvad du nu har lyst til at kalde det?
Avatar billede Klaphattens Novice
25. juni 2012 - 23:33 #11
Jeg skal nok lige smide det op i morgen når jeg kommer hjem. men det er meget simpelt.

Jeg havde lavet et inputfelt udfor hver bruger på admin-brugerlisten hvor jeg kunne skrev hold nummer. og så skrev jeg ind efterhånden som de trak et nummer.
Avatar billede inteeeL Nybegynder
26. juni 2012 - 02:12 #12
Du behøver ikke sende koden, ovenstående beskrivelse er nok. Nu skal du bare se. Jeg har i nedenstående boks opstillet to tabeller, som jeg tænker kan fungere forholdsvis hensigtsmæssigt i din kode. Den kan sikkert optimeres (evt. med dato i form af timestamp eller lignende):
CREATE TABLE `opgaver` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `navn` varchar(60) NOT NULL DEFAULT ''
  PRIMARY KEY (`id`)
)

CREATE TABLE `log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gruppeID` tinyint(3) DEFAULT NULL,
  `opgave1_ID` tinyint(3) DEFAULT NULL,
  `opgave2_ID` tinyint(3) DEFAULT NULL,
  `p1` enum('0','1') DEFAULT '0',
  `p2` enum('0','1') DEFAULT '0',
  `status` enum('0','1', '2') DEFAULT '0'
  PRIMARY KEY (`name`)
)

CREATE TABLE `brugere` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `navn` varchar(60) NOT NULL DEFAULT '',
  `kode` varchar(60) NOT NULL DEFAULT '',
  `mail` varchar(120) NOT NULL DEFAULT '',
  `oprettelse` enum('0','1') NOT NULL DEFAULT '0',
  `medlemstype` tinyint(2) DEFAULT '0',
  PRIMARY KEY (`id`)
)

CREATE TABLE `grupper` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grupper_navn` varchar(60) NOT NULL DEFAULT '',
  `p1_id` tinyint(4) DEFAULT NULL,
  `p1_id` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

Opgaver: I denne tabel oprettes opgaverne. Jeg har kun medtaget navn, da jeg ikke vidste, hvad du ellers vil medtage. Eksempelvis kunne dato for oprettelse af opgaven medtages her.

log: I log-tabellen sker de væsentligste tjek. Når en gruppe for tildelt 2 opgaver, oprettes der en række i tabellen (hvor det respektive gruppeID registreres). I stedet for både at have "igang" og "ok" med, har jeg erstattet disse to med "status". 0 indikerer, at den ikke er valgt, 1 indikerer, at opgaven er valgt (svarende til igang) og 2 indikerer, at opgaven er færdig og løst. ID'erne for de 2 respektive opgaver oprettes i felterne opgave1_ID og opgave2_ID. På den måde kan man hele tiden holde styr på, hvilke opgaver der er valgt. Når alle opgaverne er løst, slettes alle disse rækker (for den pågældende gruppe). Denne grupper kan herefter igen vælge opgaverne.

Brugere: Blot fjernelse af gruppernr-feltet. Desuden var jeg ikke sikker på, hvad "oprettelse" var, og hvordan du bruger det. Jeg gætter på, at det har noget at gøre med, om brugeren er aktiveret eller ej (i form af godkendelse over mail?). Du kan selv rette det til, hvis jeg tager fejl. Jeg går ud fra, at medlemstype/brugerniveau håndteres i form af tal - hvis det ikke er tilfældet skal tinyint ændres til varchar.

Grupper: I denne tabel oprettes grupperne. "gruppe_navn" kan du fjerne, hvis du ikke skal bruge det. P1 og P2 er hhv. person1 og person2. Værdierne for disse to personer skal korrespondere med id'et, fra bruger-tabellen. Desuden skal gruppeID fra log-tabellen passe med ID'et fra gruppetabllen.

Jeg håber ovenstående var med til at give et overblik - et indblik i, hvordan det kan laves. Jeg vil gerne hjælpe med kodedelen, men jeg tænker, du selv kan arbejde lidt på det og vende tilbage, hvis du støder på problemer.

Spørg endelig, såfremt du har spørgsmål. :-)
Avatar billede Klaphattens Novice
26. juni 2012 - 13:03 #13
Det er rigtigt rigtigt godt :-). jeg tror jeg skal blive bedre til at dele mine ting op i flere tabeller. oprettelse var datoen hvornår folk er meldt ind. den bliver alligevel snart droppet da vi ikke bruger den.

Men jeg har lige en ting jeg undre mig over.
Som jeg forstår din log tabel er det meningen at begge opgaver skal være løst, for at gruppen får nye opgave.
Er det rigtigt forstået? for der skulle jo gerne komme en ny opgave med det samme den ene er løst :-)
Avatar billede inteeeL Nybegynder
27. juni 2012 - 00:22 #14
Det er rigtig forstået - vidste ikke, det var sådan, du ville have det. Du kan gøre to ting: i stedet for status have opgave1_status og opgave2_status. Eller blot oprette en række for hver opgave, der oprettes (her fjernes opgave2_id og opgave1_id ændres bare til opgave_id <- her er det nok med status-feltet). Det er op til dig. :-)
Avatar billede Klaphattens Novice
29. juni 2012 - 23:25 #15
Undskyld jeg først svare nu. den virkelige verden ramte mig med familie fødselsdag og en høj feber jeg kæmper lidt med.

Jeg regner med at jeg sletter opgave2_ID, og køre det på den måde.

Det er også gået op for mig, at med denne struktur kan et hold trække den samme opgave 2 gange, inden de har været alle opgaverne igennem. det var heller ikke helt meningen. det regner jeg med løse ved at lader alle opgaver der er klaret, være i loggen indtil alle opgaver i tabellen "opgaver" også er i tabellen "log" og så nulstiller den.

Måden jeg ville gøre det hele på, er med if sætninger. ved ikke om det er den bedste men her er min plan, så lad mig høre om det er en holdbar plan. Hvis ikke må du gerne komme med en bedre.


1. Count antal opgaver i log where gruppeID=$gruppeID. $antal_opgaver = resultatet
2.      if ($antal_opgaver < 2){
3.            if(alle opgaver i "opgave" tabellen er i "log" tabellen){
4.                Slet alle opgaver i "log" tabellen where gruppeID=$gruppeID og where stauts=2. Siden opdateres.
5.            }else{
6.                Træk 1 opgave der er i "opgave" tabellen men ikke i "log" tabellen, og gem den i "log" tabellen. efter opdaters siden.
7.            }
8.        } else {
9.            Udskriv de 2 valge opgaver where gruppeID=$gruppeID og where status=2.
10.        }


Forklaring:
Linje 1 Tjekke antal opgaver gruppen har.
Linje 2 Hvis gruppen ikke har 2 opgaver køres linje 3 ellers køres linje 9.
Linje 3 Hvis gruppen ikke har 2 opgaver, tjekker den om der er flere uløste opgaver. hvis der ikke er køres linje 4 ellers køres linje 6.
Linje 4 Hvis der ikke er flere uløste opgaver, nulstilles opgaverne i "log" tabellen, som gruppen har løst. siden opdateres og der startes fra linje 1 igen.
Linje 6 Hvis der er flere uløste opgaver, trækker den en tilfældig opgave og ligger den i loggen. siden opdateres og starter ved linje 1 igen.
Linje 9 Udskriver de 2 opgaver.

Når begge personer på holdet har bekræftet at opgaven er løst, vil den så igen køre fra linje 1

Hvis det er en holdbar løsning, så vil jeg gerne prøve at lave det selv. men jeg spørg nok om hjælp et par gange. jeg vil gerne lave det med mysqli, som jeg læste om i en guide, men det er ikke noget jeg har prøvet før. og det mere at flette tabeller har jeg heller ikke gjort så meget i.

Hvis løsningen er holdbar, vil jeg prøve at læse mig frem til hvordan det måske skal gøres, og derefter lave et script, og så må du gerne hjælpe med at rette det jeg har lavet.
På grund af min sygdom, ved jeg ikke lige hvor meget jeg kan holde ud at lave de næste par dage, så det tager måske et par dage. før jeg har noget klart.
Avatar billede inteeeL Nybegynder
09. juli 2012 - 01:52 #16
Jeg beklager det meget sene svar - har simpelthen haft for meget at se til. Jeg gætter dog på ,at du har fundet ud af noget.

For en god ordens skyld vil jeg gerne svare. Hele meningen var jo, at der oprettes en log hvor hver opgave, der vælges. Herefter kan du nemt administrere holdene og opgaverne - og sikre dig, at man ikke kan tage den samme opgave.

Det er en pseudo-kode, så jeg kan som sådan ikke kommentere meget på det. Dine if-statements ser ganske udmærket ud. Dog er det ikke $antal_opgaver < 2 men $antalopgaver <= 2. Men antal opgaver må vel heller ikke være 0? det skal du lige have i tankerne.

God sommer. :-)
Avatar billede Klaphattens Novice
21. juli 2012 - 17:33 #17
Hey inteeeL.. :oP

Jeg havde næsten glemt at dette spørgsmål var åben. du må gerne poste et svar. jeg har fået det til at virke med din struktur. så tak for hjælpen. :o)
Avatar billede inteeeL Nybegynder
21. juli 2012 - 23:12 #18
Godt at høre, og her er et 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