mboost-dp1

php mysql billed tabel join


Gå til bund
Gravatar #1 - simonduun
10. jul. 2012 15:02
Hejsa.

Jeg har en event tabel og en billedtabel.
På en side skal alle events udskrives og tilhørende billeder til hvert event skal hentes/udskrives.

Hvilken sql sætning ville være at foretrække i denne forbindelse?
På forhånd tak :)

Venlig Hilsen
Simon
Gravatar #2 - PoulErik
10. jul. 2012 17:38
SELECT event,billede FROM event_table LEFT JOIN billede_table ON event_id=billede_id WHERE event_name=name



!!! GIVE MORE INFO !!!
Gravatar #3 - simonduun
10. jul. 2012 17:45
#2 hvad har du brug for at vide? :)

Har leget lidt med nogen lunde samme sætning. Dog er det eneste problem at den ikke henter alle tilhørende billeder ud til hvert arrangement, kun 1.

SELECT e_id, `date`, head, descr, img_filename FROM cms_events
INNER JOIN cms_images
ON cms_events.e_id = cms_images.img_arrid


EDIT: Hvad går den sidste WHERE i din sætning?
Gravatar #4 - PoulErik
10. jul. 2012 17:54
soduno (3) skrev:
Hvad går den sidste WHERE i din sætning?

Det var for at illustære at der kun skulle hentes "data" fra en event.

soduno (3) skrev:
Har leget lidt med nogen lunde samme sætning. Dog er det eneste problem at den ikke henter alle tilhørende billeder ud til hvert arrangement, kun 1.


Er ikke helt sikker på hvad du mener men hvis du har flere billeder til samme event, skal du måske left joine den anden vej. Eller RIGHT JOIN
Gravatar #5 - simonduun
10. jul. 2012 17:57
Altså når jeg snakker om event, mener jeg jo en begivenhed(concert).
Admin har mulighed for at tilføje f.eks 10 billeder til en begivenhed så brugeren kan klikke frem og tilbage(i et billedgalleri tilhørende eventet) og få et indtryk af begivenheden.

Var det uddybelse nok? (ikke ment negativt)

Glemte også at tilføje jeg havde en group by i ovenstående sætning.
Så komplet set, ser det sådan ud:

SELECT e_id, `date`, head, descr, img_filename
FROM cms_events
INNER JOIN cms_images ON cms_events.e_id = cms_images.img_arrid
WHERE `date` >='". $timenow ."' GROUP BY head LIMIT 0,9
Gravatar #6 - tazimn
10. jul. 2012 18:08
I MSSQL ville jeg nok skrive det således:
SELECT evnts.e_id, evnts.date, evnts.head, evnts.descr, img.img_filename
FROM cms_events evnts
JOIN cms_images img
ON evnts.e_id = img.img_arrid


Altså uden INNER JOIN, men bare JOIN, hvilket i MSSQLs tilfælde betyder en FULL OUTER JOIN.

Du burde kunne komme afsted med det med en OUTER JOIN.. Hvis det ikke virker, så skyder jeg skylden på at jeg er stiv..
Gravatar #7 - simonduun
10. jul. 2012 18:32
#6 Hmm... Når jeg prøver at udskrive det du skriver, udskriver den overskrifterne(head) fra tabellen cms_evens ligeså mange gange som der er billeder i tabellen cms_images. Hvordan kan jeg evt. undgå dette?

Edit. Ahh den udskriver jo header for hvert billede(img_filename).
Er det så noget Foreach man skal have fat i for at sortere resultatet?
Gravatar #8 - arne_v
10. jul. 2012 18:39
tazimn (6) skrev:
Altså uden INNER JOIN, men bare JOIN, hvilket i MSSQLs tilfælde betyder en FULL OUTER JOIN.


????

http://msdn.microsoft.com/en-us/library/ms177634%2...


INNER

Specifies all matching pairs of rows are returned. Discards unmatched rows from both tables. When no join type is specified, this is the default.
Gravatar #9 - PoulErik
10. jul. 2012 19:25
RIGHT JOIN
Gravatar #10 - simonduun
10. jul. 2012 19:35
Har prøvet Right, Left, Inner og Join uden held
Gravatar #11 - PoulErik
10. jul. 2012 20:02
SELECT e_id, `date`, head, descr, img_filename FROM cms_events
RIGHT JOIN cms_images
ON cms_events.e_id = cms_images.img_arrid

Gravatar #12 - arne_v
10. jul. 2012 20:07
Jeg er ret sikker på at du ønsker:

... FROM cms_events LEFT JOIN cms_images ...

Men prøv at uddyb hvad "uden held" dækker over.
Gravatar #13 - PoulErik
10. jul. 2012 20:13
... FROM cms_images LEFT JOIN cms_events ...
Gravatar #14 - PoulErik
10. jul. 2012 20:15
arne_v (12) skrev:
Men prøv at uddyb hvad "uden held" dækker over.


Som jeg forstår så:
Flere billeder til samme event.
Gravatar #15 - arne_v
10. jul. 2012 20:16
#13

Det er kun hvis man vil vise billeder uden event. Det lyder ikke plausibelt.
Gravatar #16 - arne_v
10. jul. 2012 20:17
#14

Det kan enhver JOIN.
Gravatar #17 - PoulErik
10. jul. 2012 20:22
arne_v (15) skrev:
#13
Det er kun hvis man vil vise billeder uden event. Det lyder ikke plausibelt.


Jeg forstår det heller ikke helt.

Jeg ville nok lave det med to sql kald from for join. Men det kommer vel an på hvordan sitet er opbygget.
Gravatar #18 - simonduun
10. jul. 2012 20:55
Ok forklaring herunder:

Hvis jeg bruger seneste query bliver mit resultat:
Udstilling 11-07-12
1341493455-_AAA3890.jpg
Udstilling 11-07-12
1341923078-_AAA3909.jpg
Udstilling 11-07-12
1341923079-_AAA3910.jpg
Koncert 12-07-12
1341923162-1338745223.png
Koncert 12-07-12
1341923162-clementine.png
Koncert 12-07-12

Jeg ønsker følgende resultat:
Udstilling, 11-7-12
Billeder i et array

Koncert 12-7-12
Billeder i et array

Tabel oversigt
cms_events:
e_id, head, descr, date

cms_images:
img_id, img_arrid(til e_id), img_filename
Gravatar #19 - PoulErik
10. jul. 2012 21:04
SELECT e_id, `date`, head, descr, GROUP_CONCAT(img_filename) FROM cms_events
LEFT JOIN cms_images
ON cms_events.e_id = cms_images.img_arrid GROUP BY e_id


... måske ...
Gravatar #20 - arne_v
10. jul. 2012 21:57
#18

Det har jo ikke noget med SQL at gøre.

En SELECT returnerer rektangulære data (N kolonner x M rækker).

En anden visning skal laves i applikationen !
Gravatar #21 - simonduun
10. jul. 2012 21:57
PoulErik (19) skrev:
SELECT e_id, `date`, head, descr, GROUP_CONCAT(img_filename) FROM cms_events
LEFT JOIN cms_images
ON cms_events.e_id = cms_images.img_arrid GROUP BY e_id


Den udskriver "kun" følgende:

Udstilling 11-07-12
1341493455-_AAA3890.jpg
Koncert 12-07-12
1341923162-1338745223.png
Gravatar #22 - simonduun
10. jul. 2012 22:02
arne_v (20) skrev:
#18

Det har jo ikke noget med SQL at gøre.

En SELECT returnerer rektangulære data (N kolonner x M rækker).

En anden visning skal laves i applikationen !


Hvad skal der evt. til kodemæssigt?
Gravatar #23 - arne_v
10. jul. 2012 22:08
#22

Et test på om et felt har samme værdi som forrige række.
Gravatar #24 - simonduun
10. jul. 2012 22:56
arne_v (23) skrev:
#22
Et test på om et felt har samme værdi som forrige række.


Hvordan tester man om noget har den samme værdi som forrige række?
Gravatar #25 - arne_v
10. jul. 2012 23:34
#24

Jeg kan lave et eksempel.

Hvad programmerer du i? PHP? Java? C#?
Gravatar #26 - simonduun
11. jul. 2012 00:24
PHP. Tak fordi du gider :)
Gravatar #27 - arne_v
11. jul. 2012 02:30

CREATE TABLE main (
id INTEGER NOT NULL,
txt VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE subs (
id INTEGER NOT NULL,
nam VARCHAR(50) NOT NULL,
main_id INTEGER NOT NULL,
PRIMARY KEY(id)
);

INSERT INTO main VALUES(1, 'All A');
INSERT INTO main VALUES(2, 'All B');
INSERT INTO main VALUES(3, 'All C');
INSERT INTO subs VALUES(1, 'A1.jpg', 1);
INSERT INTO subs VALUES(2, 'B1.jpg', 2);
INSERT INTO subs VALUES(3, 'B2.jpg', 2);
INSERT INTO subs VALUES(4, 'B3.jpg', 2);

SELECT main.txt,subs.nam
FROM main JOIN subs ON main.id=subs.main_id
ORDER BY main.txt;
SELECT main.txt,subs.nam
FROM main LEFT JOIN subs ON main.id=subs.main_id
ORDER BY main.txt;



<?php
class Main {
public $txt;
public $subs;
public function __construct($txt) {
$this->txt = $txt;
$this->subs = array();
}
};

class Sub {
public $nam;
public function __construct($nam) {
$this->nam = $nam;
}
};

function load() {
$data = array();
$con = new mysqli('localhost', 'root', '', 'Test');
$stmt = $con->prepare('SELECT main.txt,subs.nam FROM main LEFT JOIN subs ON main.id=subs.main_id ORDER BY main.txt;');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($maintxt, $subnam);
$ix = 0;
$lastmaintxt = '>>>>BOF<<<<';
while($stmt->fetch()) {
if($maintxt != $lastmaintxt) {
$ix++;
$data[$ix] = new Main($maintxt);
$lastmaintxt = $maintxt;
}
if($subnam != null) $data[$ix]->subs[] = new Sub($subnam);
}
$stmt->close();
$con->close();
return $data;
};

function display_as_lists($data) {
echo "<ul>\r\n";
foreach($data as $main) {
echo "<li>$main->txt</li>\r\n";
echo "<ul>\r\n";
foreach($main->subs as $sub) {
echo "<li>$sub->nam</li>\r\n";
}
echo "</ul>\r\n";
}
echo "</ul>\r\n";
};

function display_as_table($data) {
echo "<table border='1'>\r\n";
echo "<tr><th>Text</th><th>Name</th></tr>\r\n";
foreach($data as $main) {
echo "<tr>\r\n";
$n = count($main->subs);
echo "<td rowspan='$n'>$main->txt</td>\r\n";
for($ix = 0; $ix < $n; $ix++) {
if($ix > 0) echo "</tr>\r\n<tr>\r\n";
$sub = $main->subs[$ix];
echo "<td>$sub->nam</td>\r\n";
}
echo "</tr>\r\n";
}
echo "</table>\r\n";
}

$data = load();
display_as_lists($data);
display_as_table($data);

?>
Gravatar #28 - arne_v
11. jul. 2012 02:30
#27

Ikke den bedste kode, men hvad mine beskedne PHP evner rækker til.

Gravatar #29 - arne_v
11. jul. 2012 02:31
Bemærk at GROUP_CONCAT som foreslået i #19 godt kan bruges, hvis det er OK med filnavnene i en komma separeret streng.
Gravatar #30 - arne_v
11. jul. 2012 02:32

mysql> SELECT main.txt,subs.nam
-> FROM main JOIN subs ON main.id=subs.main_id
-> ORDER BY main.txt;
+-------+--------+
| txt | nam |
+-------+--------+
| All A | A1.jpg |
| All B | B2.jpg |
| All B | B3.jpg |
| All B | B1.jpg |
+-------+--------+
4 rows in set (0.00 sec)

mysql> SELECT main.txt,subs.nam
-> FROM main LEFT JOIN subs ON main.id=subs.main_id
-> ORDER BY main.txt;
+-------+--------+
| txt | nam |
+-------+--------+
| All A | A1.jpg |
| All B | B2.jpg |
| All B | B3.jpg |
| All B | B1.jpg |
| All C | NULL |
+-------+--------+
5 rows in set (0.00 sec)

mysql> SELECT main.txt,GROUP_CONCAT(subs.nam)
-> FROM main LEFT JOIN subs ON main.id=subs.main_id
-> GROUP BY main.txt
-> ORDER BY main.txt;
+-------+------------------------+
| txt | GROUP_CONCAT(subs.nam) |
+-------+------------------------+
| All A | A1.jpg |
| All B | B2.jpg,B3.jpg,B1.jpg |
| All C | NULL |
+-------+------------------------+
3 rows in set (0.00 sec)
Gravatar #31 - Mnc
11. jul. 2012 06:11
Du fortjener sgu næsten 200 point for det der, Arne. :P
Gravatar #32 - arne_v
11. jul. 2012 12:26
#31

Andet forum .............

:-)
Gravatar #33 - simonduun
11. jul. 2012 12:53
Wov damn arne. Dine php kundskaber rækker sku da til mere end hvad jeg kan tyde. Takker so far. Og ja mindst 500 points til dig ;)

Nu er det ikke fordi jeg vil være nedern eller utaknemlig, men kan eksemplet laves uden oop? Jeg sutter til oop og der er en fejl et eller andet sted (muligvis mig selv der har lavet den) og aner ikke hvor jeg skal starte :P
Gravatar #34 - Mnc
11. jul. 2012 13:04
#33
Det var en reference til exp.dk hvor arne ofte hjælper folk. :)

Jeg har selv tidligere måttet punge ud, og give arne point. :D
Gravatar #35 - arne_v
11. jul. 2012 13:57
#33

Det kan vel godt laves uden classes, men i det her tilfælde synes jeg at det er praktisk at kunne bundte sammenhørende information i et enkelt objekt.

Men load kunne godt rettes til at returnere flere arrays - jeg synes bare at det vil blive noget værre spagetti.
Gravatar #36 - arne_v
11. jul. 2012 13:58
soduno (33) skrev:
uden oop


arne_v (35) skrev:
uden classes


Med public fields og ingen methods vil jeg ikke kalde koden noget så fint som OOP.
Gravatar #37 - tazimn
11. jul. 2012 17:41
arne_v (8) skrev:
tazimn (6) skrev:
Altså uden INNER JOIN, men bare JOIN, hvilket i MSSQLs tilfælde betyder en FULL OUTER JOIN.


????

http://msdn.microsoft.com/en-us/library/ms177634%2...


INNER

Specifies all matching pairs of rows are returned. Discards unmatched rows from both tables. When no join type is specified, this is the default.


Jævnfør:

tazimn (6) skrev:
Hvis det ikke virker, så skyder jeg skylden på at jeg er stiv..


Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login