Avatar billede nicocarlos Nybegynder
23. juni 2007 - 02:39 Der er 68 kommentarer og
1 løsning

Gem i Array problem

Hejsa.

Jeg har en mysql database, hvor der ligger nogle forskellige "items".

Det er sådan, så at man kan vælge nogle forskellige items på nogle forskellige dage.

F.eks. kan der på dag 3 ligge:

vareid = 1, antal = 10
vareid = 500, antal = 5

Og mange flere, men derudover kan der på dag 4 ligge:

vareid = 250, antal 10
vareid = 500, antal 10

Så vil jeg lave en while løkke der skal printe:

vareid = 1, antal 10
vareid = 500, antal 15
vareid = 250, antal 10

altså at den ligger dem sammen, der hvor vare id er ens. Mit spørgsmål går på om det er smartest at lave med Array, samt hvordan det laves bedst?

Hvis jeg laver et Array med [1] = 10, [500] = 15, så er der vel ikke 499 tomme pladser der ligger og fylder vel?

På forhånd tak
Avatar billede morhan Novice
23. juni 2007 - 03:27 #1
select vareid, sum(antal) as total from items group by vareid;
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:09 #2
Hmm, ja men det er lidt mere indviklet - det var bare en del af et større billede du så der.

Det kan godt være det kan laves i MYSQL, lad mig beskrive det:

Jeg har en tabel med slikdele(id, pris_gram) - denne indeholder alle standard dele.

Jeg har en tabel med deletilpose(id, post_id, slikdel_id, vægt) - denne kobler ovenstående og nedenstående sammen.

Jeg har en tabel med slikpose(id, navn) - det er selve posens navn

Jeg har en tabel med valgteposer(id, valg1, valg2, valg3, dato), man kan vælge 3 poser om dagen og de kan godt være de samme.

SÅ vil jeg f.eks. vælge 3 dage og så skal den printe hvor mange gram der er af hver del f.eks. hvis der er 100g røde vingummi den 010707 og 50g den 020707, så skal den ligge disse sammen og det samme med alle andre i de pågældende poser.


Håber du forstår
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:10 #3
"SÅ vil jeg f.eks. vælge 3 dage og så skal den printe hvor mange gram der er af hver del f.eks. hvis der er 100g røde vingummi den 010707 og 50g den 020707, så skal den ligge disse sammen og det samme med alle andre i de pågældende poser."

EDIT:
Printe den samlede pris på de røde vingummier på de pågældende dage.
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:12 #4
Jo, der vil vel være et antal tomme pladser i dit array, men du kan jo bare lave et 2D array istedet?
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:12 #5
F.eks.

Røde vingummi - 150g (100g dag 1 + 50g dag 2)
Grønne bolcher - 200g (100g dag 2 + 50g dag 3 + 50g dag 4)
etc
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:13 #6
[1][1] = 1, [1][2] = 10
[2][1] = 500, [2][2] = 15
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:13 #7
mikkelk, kan du give mig et eksempel i forhold til det her slik eksempel?
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:22 #8
Du kan vel bare lave det med en select:

select sum(deletilpose.vægt), slikdele.pris_gram from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id group by slikdele.id, slikdele.pris_gram
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:22 #9
(den er IKKE testet)
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:25 #10
sygt, prøver lige at lave den så den passer til, vender lige tilbage :D
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:26 #11
Mht. array, så kommer det jo an på hvordan du sidenhen skal bruge data sidenhen om det er smartest at have dem i et array - det må du selv vurdere. Hvad angår 2D arrays i php, så kan du læse om dem her: http://www.homeandlearn.co.uk/php/php17p4.html
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:28 #12
Jeg skal sådan set kun bruge dem til at printe ud:
Røde vingummi - 150g
Grønne bolcher - 200g

ikke andet
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:31 #13
så må det være helt fint at hente dem direkte fra MySQL med en select, som vist
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:34 #14
okay men jeg skal også have den i forhold til dato.

Hvis det f.eks. er 3 dage frem fra dags dato. Det er ikke på i den sql du har vist der vel?
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:37 #15
Kom lige i tanke om at det er faktisk ikke prisen jeg skal bruge til noget, så bruger faktisk ikke den der hedder slikdele.

Jeg skal bare have den samlede vægt fra deletilpose
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:37 #16
nej, der skal du så have noget a'la:
select sum(deletilpose.vægt), slikdele.pris_gram from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id group by slikdele.id, slikdele.pris_gram where valgteposer.dato = DATO1 or valgteposer.dato = DATO2  osv...
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:38 #17
select sum(deletilpose.vægt), slikdele.id from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id group by slikdele.id where valgteposer.dato = DATO1 or valgteposer.dato = DATO2  osv...
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:40 #18
satme nogle syge sql sætninger, jeg prøver lige.
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:42 #19
:-)
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:43 #20
Jeg tænkte lige at "vægt), slikdele.id from "

Slikdele.id bruges vel overhovedet ikke? - Jeg har jo selve slikdele_id og vægten i deletilpose tabellen.
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:44 #21
Og da jeg ikke skal bruge prisen kan det vel være lige meget
Avatar billede mikkelk Nybegynder
23. juni 2007 - 22:50 #22
nej, det er sandt...det kan jo gøre det hele lidt kortere:
select sum(deletilpose.vægt), deletilpose.slikdel_id from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) group by slikdele.id where valgteposer.dato = DATO1 or valgteposer.dato = DATO2  osv...
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:52 #23
Prøver lige
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 22:57 #24
Hvordan vil du printe den, med en while?
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:03 #25
Sådan så den kommer til at hedde:

slikdele.navn - summen
slikdele.navn - summen
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:03 #26
Tja, jeg ville gøre som du plejer når du printer data fra en select i php...
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:07 #27
ja men jeg har aldrig lavet en så indviklet sql sætning og det skal gerne stå som.

Navn - Sum
Navn - Sum

men prøver da lige
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:10 #28
SQL-sætningen er såmænd ikke så indviklet, den kobler blot de 3 tabeller sammen, gruperer data og retunerer 2 felter. Så du får blot en liste med 2 felter svarende til at du havde skrevet noget i retning af: "select felt1, felt2 from tabel1"
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:16 #29
okay :D - men jeg synes den er rimlig indviklet :D

Får følgende fejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where valgteposer.dato = '230607' or valgteposer.dato = '240607'' at line 7

Line:
where valgteposer.dato = '230607' or valgteposer.dato = '240607'
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:17 #30
Ah...min fejl tror jeg :-)
select sum(deletilpose.vægt), deletilpose.slikdel_id from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) where valgteposer.dato = DATO1 or valgteposer.dato = DATO2  osv...  group by slikdele.id
(altså byt om på WHERE delen og GROUP delen)
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:18 #31
har prøvet at printe den med while($vis = mysql_fetch_array($resultat)) {
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:18 #32
ahh ok prøver lige :D
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:21 #33
Nu får jeg en ny fejl:

Unknown table 'deletilpose.vægt' in field list

Det er sku underligt, for den findes
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:24 #34
fandt ud af det havde bare lige mig der lavede en lille fejl :D

Nu får jeg følgende fejl:

Unknown table 'slikdele' in group statement

og den findes også O_o
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:26 #35
valgteposer.dato = DATO1 or valgteposer.dato = DATO2 group by slikpost.id - sådan ser den ud
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:28 #36
Kom lige med hele sql-sætningen
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:32 #37
select sum(deletilpose.vægt), deletilpose.slikdel_id from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) where valgteposer.dato = $dag1 or valgteposer.dato = $dag2 group by slikdele.id
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:33 #38
select sum(deletilpose.vægt), deletilpose.slikdel_id from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where valgteposer.dato = $dag1 or valgteposer.dato = $dag2 group by slikdele.id
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:34 #39
Eller:
select sum(deletilpose.vægt) as vaegt, deletilpose.slikdel_id as slikid from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where valgteposer.dato = $dag1 or valgteposer.dato = $dag2 group by slikdele.id

De to "felter" du så har at bruge er "vaegt" og "slikid"
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:48 #40
hmm det går lidt galt i print:

while($vis = mysql_fetch_array($resultat)) {           
                echo "id".$vis['slikid']." gram: ".$vis['gram'];
}

Resultat:
id gram: 20id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000id gram: 1000

Jeg har smidt en ekstra where ind "and brugerid='$brugerinfo[id]'"

I forhold til tabellen burde den printe:
id: 1 gram: 1000
id: 11 gram: 20
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:49 #41
Det er som om den får rigtigt fat i de 2 tal, men 1000 står bare mange gange.
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:51 #42
select sum(deletilpose.vægt) as vaegt, deletilpose.slikdel_id as slikid from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where valgteposer.dato = $dag1 or valgteposer.dato = $dag2 group by deletilpose.slikdel_id
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:55 #43
Resultat:
id gram: 42000id gram: 10id gram: 10

:(
Avatar billede mikkelk Nybegynder
23. juni 2007 - 23:58 #44
Skriver den slet ikke noget id?
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:59 #45
Skal jeg fortælle dig hvad der ligger i tabellerne?
Avatar billede nicocarlos Nybegynder
23. juni 2007 - 23:59 #46
nej ikke noget id :/
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:02 #47
jo nu er idet sku med, ændrede ikke noget O_O

Resultat:
id1 gram: 42000id11 gram: 10id1 gram: 10
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:04 #48
id: 1 gram: 42000
id: 11 gram: 10
id: 1 gram: 10

Og det burde så være:
id: 1 gram: 1000
id: 11 gram: 20
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:06 #49
På første dag er det:

Id: 1 gram: 1000
id: 11 gram: 10

På anden dag:

id: 11 gram: 10

Hvis det hjælper noget i forhold til tabellen
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:09 #50
mystisk... sikker på dine datoer?
Prøv lige med
select sum(deletilpose.vægt) as vaegt, deletilpose.slikdel_id as slikid from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where (valgteposer.dato = $dag1 or valgteposer.dato = $dag2) and not deletilpose.slikdel_id group by deletilpose.slikdel_id
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:10 #51
Det der 42000 passer med alle de gange der står 1000 længere oppe O_o, ved ikke lige hvorfor den ganger det 42 gange.
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:10 #52
hov...
select sum(deletilpose.vægt) as vaegt, deletilpose.slikdel_id as slikid from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where (valgteposer.dato = $dag1 or valgteposer.dato = $dag2) and not deletilpose.slikdel_id is null group by deletilpose.slikdel_id
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:14 #53
prøv lige:
select sum(deletilpose.vægt) as vaegt, deletilpose.slikdel_id as slikid from ((valgteposer left join slikpose on valgteposer.valg1 = slikpose.id or valgteposer.valg2 = slikpose.id or valgteposer.valg3 = slikpose.id) left join deletilpose on slikpose.id = deletilpose.post_id) left join slikdele on deletilpose.slikdel_id = slikdele.id where (valgteposer.dato = $dag1 or valgteposer.dato = $dag2) and not deletilpose.slikdel_id is null group by valgteposer.dato, deletilpose.slikdel_id
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:14 #54
og skriv resultatet af den sidste herind...
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:16 #55
nu printer den overhovedet ikke noget :/

Kan det være fordi at valg2, valg3 er 0 på den ene dag f.eks.?
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:17 #56
okay det var ikke den sidste prøver lige den
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:17 #57
hmm... synes det er lidt mystisk... kan du ikke evt. lige sende mig et dump af databasen? mikkel[at]kongsfelt[dot]dk
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:19 #58
jo gør jeg lige
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:32 #59
den er på vej nu
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:37 #60
har du fået det, har ændret nogle navne og sådan fordi jeg var pisse forvirret tilsidst. Men det hjalp ikke
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:40 #61
Så lige en fejl, der er en:
INSERT INTO `d_opskrifter` VALUES (11, 'slik', 'blå vingummi');
Avatar billede mikkelk Nybegynder
24. juni 2007 - 00:43 #62
mangler for raavare-tabellen...
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:45 #63
$dag1=230607;
$dag2=240607;

undskyld den får du lige.
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:51 #64
jeg har sendt
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 00:51 #65
Håber du kan finde rundt i dem, jeg har slettet en del i løbet af dagen og tilføjet, ændret navn osv. Fordi det ikke ville virke :(
Avatar billede mikkelk Nybegynder
24. juni 2007 - 01:17 #66
Tabellerne ser lidt anderledes ud, men dette er løsningen der virkede:
select sum(d_ingre.gram) as gram, d_ingre.ravare_id as slikid from
(
    (
        d_kostplan left join d_ingre on
            d_kostplan.morgen_id = d_ingre.opskrift_id or
            d_kostplan.mellem1_id = d_ingre.opskrift_id or
            d_kostplan.middag_id = d_ingre.opskrift_id or
            d_kostplan.mellem2_id = d_ingre.opskrift_id or
            d_kostplan.aften_id = d_ingre.opskrift_id or
            d_kostplan.mellem3_id = d_ingre.opskrift_id
    )

)
left join d_ravarer on d_ingre.ravare_id = d_ravarer.id
where
(
    d_kostplan.dato = 230607 or d_kostplan.dato = 240607
)
and not d_ingre.ravare_id is null

group by d_ingre.ravare_id;
Avatar billede mikkelk Nybegynder
24. juni 2007 - 01:20 #67
et svar
Avatar billede nicocarlos Nybegynder
24. juni 2007 - 01:24 #68
("select sum(d_ingre.gram) as gram, d_ingre.ravare_id as slikid from((d_kostplan left join d_ingre on
            d_kostplan.morgen_id = d_ingre.opskrift_id or
            d_kostplan.mellem1_id = d_ingre.opskrift_id or
            d_kostplan.middag_id = d_ingre.opskrift_id or
            d_kostplan.mellem2_id = d_ingre.opskrift_id or
            d_kostplan.aften_id = d_ingre.opskrift_id or
            d_kostplan.mellem3_id = d_ingre.opskrift_id)) left join d_ravarer on d_ingre.ravare_id = d_ravarer.id where (d_kostplan.dato = 230607 or d_kostplan.dato = 240607)
            and not d_ingre.ravare_id is null
            group by d_ingre.ravare_id")
Avatar billede mikkelk Nybegynder
24. juni 2007 - 01:26 #69
select sum(d_ingre.gram) as gram, d_ingre.ravare_id as slikid from ((d_kostplan left join d_ingre on d_kostplan.morgen_id = d_ingre.opskrift_id or d_kostplan.mellem1_id = d_ingre.opskrift_id or d_kostplan.middag_id = d_ingre.opskrift_id or            d_kostplan.mellem2_id = d_ingre.opskrift_id or d_kostplan.aften_id = d_ingre.opskrift_id or d_kostplan.mellem3_id = d_ingre.opskrift_id)) left join d_ravarer on d_ingre.ravare_id = d_ravarer.id where (d_kostplan.dato = 230607 or d_kostplan.dato = 240607 ) and not d_ingre.ravare_id is null group by d_ingre.ravare_id;
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