Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 08 Απρ 2011 19:51

Γεια σας παιδιά,

Έχω 3 πίνακες

Players
player_id
player_name

Cards_Players
cards_player_id
player_id
card_name
date

Photos
photo_id
player_id
photo_url

Θέλω να πάρω από τους παραπάνω πίνακες όλους τους παίκτες, τις κάρτες τους και τις φωτογραφίες τους.

Παράδειγμα
1. Rooney (photo1, photo2, photo3)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011
- Yellow Card, 01-04-2011
2. Ronaldo (photo71, photo42, photo23, photo2, photo9)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011
- Yellow Card, 01-04-2011
3. Raul (photo1)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011

Προσπάθησα με left join αλλά δεν το κατάφερα. Καταφέρνω να παίρνω μόνο την μια φώτο και την μια κάρτα από τον καθένα τους, όχι όλες.

Οποιαδήποτε ιδέα ευπρόσδεκτη.

Ευχαριστώ εκ των προτέρων.

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 08 Απρ 2011 20:24

Πιο συγκεκριμένα για να σας βοηθήσω:

Ο κώδικας:

Κώδικας: Επιλογή όλων

<?php
$con = mysql_connect&#40;"localhost","root",""&#41;;
if &#40;!$con&#41;
  &#123;
  die&#40;'Could not connect&#58; ' . mysql_error&#40;&#41;&#41;;
  &#125;

mysql_select_db&#40;"testdbjoin", $con&#41;;

$result = mysql_query&#40;"SELECT players.player_id, players.player_name, photos.player_id, photos.photo_url FROM players LEFT JOIN photos ON players.player_id = photos.player_id"&#41;;

while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
  &#123;
  echo $row&#91;'player_id'&#93; . " " . $row&#91;'player_name'&#93;." - " . $row&#91;'photo_url'&#93;;
  echo "<br />";
  &#125;

mysql_close&#40;$con&#41;;
?>
εμφανίζει τα παρακάτω αποτελέσματα:
1 Rooney - photo1
1 Rooney - photo2
1 Rooney - photo3
2 Ronaldo - photo71
2 Ronaldo - photo42
2 Ronaldo - photo23
2 Ronaldo - photo2
2 Ronaldo - photo9
3 Raul - photo1

αρχικά για να καταλάβω το join, πως θα φτιάξω το ερώτημα ώστε να εμφανίζεται έτσι;
1 Rooney
(photo1, photo2, photo3)

2 Ronaldo
(photo71, photo42, photo23, photo2, photo9)

3 Raul
(photo1)

Υ.Γ. Αργότερα θα δούμε για τις κάρτες, ίσως να μπορέσω να το φτιάξω και μόνος αν κατανοήσω το παραπάνω.

Ευχαριστώ!

javment
Δημοσιεύσεις: 25
Εγγραφή: 02 Οκτ 2010 01:02
Επικοινωνία:

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από javment » 08 Απρ 2011 20:29

Χωρίς να είμαι σίγουρος, δεν το δοκίμασα αλλά για ρίξε μια ματιά

Κώδικας: Επιλογή όλων

select Players.player_id,Players.player_name,GROUP_CONCAT&#40;Photos.photo_url&#41; from Players Left JOIN Photos ON Players.player_id = Photos.player_id GROUP BY Players.player_id

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 09 Απρ 2011 00:31

javment σ΄ευχαριστώ πολύ, αυτό ήταν! :)

Κώδικας: Επιλογή όλων

$result = mysql_query&#40;"
					  SELECT players.player_id, players.player_name, GROUP_CONCAT&#40;photos.photo_url&#41; AS photo_urls
					  FROM players AS players
					  LEFT JOIN photos AS photos ON players.player_id = photos.player_id 
					  GROUP BY players.player_id
					 "&#41;;
while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
  &#123;
  echo $row&#91;'player_id'&#93; . " " . $row&#91;'player_name'&#93;." - " . $row&#91;'photo_urls'&#93;;
  echo "<br />";
  &#125;

mysql_close&#40;$con&#41;;
Σωστό Αποτέλεσμα:
1 Rooney - photo3,photo2,photo1
2 Ronaldo - photo9,photo2,photo23,photo42,photo71
3 Raul - photo1


Τώρα πως θα εμφανίσουμε και τις ημερομηνίες που πήραν κάρτες οι παίχτες;

Δοκίμασα με μια δεύτερη left join αλλά εμφανίζει τα αποτελέσματα πολλές φορές.


Παράδειγμα:
Παράδειγμα
1. Rooney (photo1, photo2, photo3)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011
- Yellow Card, 01-04-2011

2. Ronaldo (photo71, photo42, photo23, photo2, photo9)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011
- Yellow Card, 01-04-2011

3. Raul (photo1)
- Red Card, 16-02-2011
- Yellow Card, 27-02-2011

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από jpk » 09 Απρ 2011 04:18

Γιατί δεν παίρνεις πρώτα τους παίκτες σε ένα rs ή array (με PDO είναι πιο εύκολο κατ’ εμέ) και μετά λουπάροντάς τους για τον καθένα να παίρνεις τις φωτογραφίες με ένα statement και τις κάρτες; Αν σκέφτεσαι το κόστος , θα είναι μικρότερο γιατί prepared θα είναι αυτά τα τρία statements , άσε που η βάση και από μόνη της καταλαβαίνει τι κάνεις&#8230;

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 09 Απρ 2011 04:32

Σε ένα query είναι αδύνατο να γίνει;

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από jpk » 09 Απρ 2011 04:56

(όλα γίνονται (σχεδόν) το κόστος είναι το θέμα) Ένα query τι φέρνει; Ένα αποτέλεσμα .. ένα result set ή αλλιώς ένα row , ο πίνακας Photos δεν συνδέεται απευθείας με τον πίνακα Cards_Players παρά μονάχα μέσω του player_id. Σκέψου το σαν να ήταν excel τι θα ήθελες οι κολόνες σου τελικά να έχουν τίτλο;

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 09 Απρ 2011 14:23

Νομίζω πως δεν έχει σχέση ο Cards_Players με τον Photos.

Εγώ θέλω να παίρνω τις κάρτες και τις φωτογραφίες των παιχτών.

Το πρώτο το πετύχαμε με την GROUP_CONCAT(Photos.photo_url).

Δεν μπορώ να το χρησιμοποιήσω και για τις card_name - date του πίνακα Cards_Players σε ένα μόνο ερώτημα;

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από fafos » 10 Απρ 2011 19:36

Κώδικας: Επιλογή όλων

<?
$con = mysql_connect&#40;"localhost","root",""&#41;;
if &#40;!$con&#41;
  &#123;
  die&#40;'Could not connect&#58; ' . mysql_error&#40;&#41;&#41;;
  &#125;

mysql_select_db&#40;"plays", $con&#41;; 

$result = mysql_query&#40;"
                 SELECT players.*, GROUP_CONCAT&#40;DISTINCT&#40;photos.photo_url&#41;&#41; AS photo, GROUP_CONCAT&#40;DISTINCT&#40;cards_players.card_name&#41;,'|', cards_players.date&#41; AS card
                 FROM players AS players
                 LEFT JOIN photos AS photos ON players.player_id = photos.player_id
                 LEFT JOIN cards_players AS cards_players ON players.player_id = cards_players.player_id				 
                 GROUP BY players.player_id
                "&#41;;
while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
  &#123;
  echo $row&#91;'player_id'&#93; . " " . $row&#91;'player_name'&#93;;
  echo "<br />Photos&#58;<br />".$row&#91;'photo'&#93;;
  echo "<br />Cards&#58;<br />"; 
$cards = explode&#40;',',$row&#91;'card'&#93;&#41;;  
foreach&#40;$cards as $card&#41; &#123;
$card = explode&#40;'|',$card&#41;;
$date = date_create&#40;$card&#91;1&#93;&#41;;
$date = date_format&#40;$date, 'd-m-Y'&#41;;
echo $card&#91;0&#93;.' &#40;'.$date.'&#41; | ';

&#125;
 
  echo "<hr>";  
  &#125;
  
  
  ?>

aplos synexizeis ta group concat...

exo valei ena separate ('|') gia na mou diaxorisei to eidos ths kartas apo thn hmeromhnia gia na mporeso na thn epexergasto me to foreach mesa sthn loupa..

ta date format ta exo giati to dokimasa me datetime typo sthn vash mou... an dinei etoimo format sthn vash den xreiazontai auta..

sto parapano paradeigma to apotelesma einai:

Κώδικας: Επιλογή όλων

1 rounei
Photos&#58;
11.jpg,1.jpg
Cards&#58;
yellow &#40;04-04-2011&#41; | yellow &#40;09-04-2011&#41; | red &#40;10-04-2011&#41; | 

_________________________________________________________________

2 ronaldo
Photos&#58;
2.jpg,22.jpg
Cards&#58;
yelow &#40;10-04-2011&#41; | red &#40;01-04-2011&#41; | 

_____________________________________________________________

3 xotza
Photos&#58;
3.jpg
Cards&#58;
yelow &#40;05-04-2011&#41; | 

____________________________________________________________________


4 paparas
Photos&#58;
4.jpg
Cards&#58;
red &#40;07-04-2011&#41; | 

Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από pimpogio » 10 Απρ 2011 20:08

κανε map τα data σε php objects για καλυτερη οργανωση ευκολια

Player has 0:N cards -> συνθεση
Player has 0:N photos -> συνθεση

class Card{.....}
class Photo{.....}
class Player{
private $cards=new array();
private $photos=new array();
....

getters/setters ktlp ...
}

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Περίπλοκο ερώτημα με Joins περισσότερα από 1 στοιχεία από 2 πίνακες

Δημοσίευση από Akis_gr49 » 11 Απρ 2011 12:45

Pimpogio σ΄ευχαριστώ!

Φίλε fafos σ' ευχαριστώ πολύ! Δούλεψε μια χαρά με την GROUP_CONCAT έτσι όπως το ήθελα. :)

Μπορείτε να μου πείτε στα βιβλία php και mysql γιατί δεν έχουν υπάρχουν αυτές οι περίπλοκες συναρτήσεις;

Ευχαριστώ και πάλι, να είστε καλά!

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες