Πρόβλημα σε ερωτήματα

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

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

Απάντηση
Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 07 Ιαν 2013 21:34

Καλησπέρα σε όλους, τις τελευταίες μέρες αντιμετωπίζω πρόβλημα στο παρακάτω ερώτημα:


Έχω τους παρακάτω πίνακες:

1) quiz (id, user_id, id_omadas, title, mathima_id, shmeiwseis, permission, date)

και

2) omades_xristwn (id_omad, student_id, id_omadas)

αυτό που θέλω σε αυτή την περίπτωση είναι να εμφανίζω σε έναν πίνακα τα quiz στα οποία το id του μαθητή (student_id) βρίσκεται μέσα στον πίνακα omades_xristwn που σχετίζει τον κάθε μαθητή με μια ομάδα (id_omadas) αλλά ταυτόχρονα να εμφανίζει και τα quiz που έχουν σαν id_omadas 0, δηλαδή δεν ανήκουν σε κάποια ομάδα χρηστών από τον πίνακα omades_xristwn και είναι τα λεγόμενα στην περίπτωση μου ελεύθερα quiz που απευθύνονται σε όλους ανεξαρτήτως ομάδας.

παρακάτω είναι η προσπάθεια μου:

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

$result=mysql_query("SELECT * FROM omades_xristwn WHERE student_id ='".$user_id."' ");

if(mysql_num_rows($result)>0){

while($row=mysql_fetch_array($result))
{

$result1=mysql_query("SELECT * FROM quiz WHERE id_omadas ='".$row['id_omadas']."' || id_omadas IS NULL order by date ASC");

    if(mysql_num_rows($result1)>0){

    while($row1=mysql_fetch_array($result1))
    {
  ?>

<tbody>
<?php

echo '<tr>';
echo '<td align=center>' . $row1&#91;'id_omadas'&#93; . '</td>';
echo '<td align=center>' . $row1&#91;'title'&#93; . '</td>';
echo '<td align=center>' . $row1&#91;'mathima_id'&#93; . '</td>';

echo '<td align=center>' . $row1&#91;'shmeiwseis'&#93; . '</td>';

echo '<td align=center>' . $row1&#91;'date'&#93; . '</td>';
επιχείρησα στο πρώτο ερώτημα με μια OR να εμφανίζει και τα quiz με id_omadas 0 αλλά μου εμφάνισε αμέτρητες εγγραφές και επαναλαμβανόμενες.
miteletsis

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από mrpc » 07 Ιαν 2013 23:43

Αυτό ισχύει επειδή το δεύτερο ερώτημα είναι μέσα σε loop ουσιαστικά. Δηλαδή για ΚΑΘΕ ομάδα χρηστών εσύ ξανατραβάς και όλα τα κενά, για αυτό έχεις duplicates.
Για να το υλοποιήσεις με τον τρόπο που το έχεις, βγάλε το or Και τρέξε ένα ξεχωριστό ερώτημα εκτός του while. Αλλιώς παίξε με joins.

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 07 Ιαν 2013 23:50

χμμ.. μπερδεύομαι αρκετά όμως γιατί όλα θέλω να τα έχω σε έναν πίνακα το ένα κάτω από το άλλο. θα έχει ας πούμε 20 εγγραφές και μέσα μπερδεμένες και κάποιες που ανήκουν σε κάποιο quiz με id_omadas 0
miteletsis

Άβαταρ μέλους
mrpc
WebDev Moderator
Δημοσιεύσεις: 3393
Εγγραφή: 03 Μάιος 2000 03:00
Τοποθεσία: Εξάρχεια
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από mrpc » 08 Ιαν 2013 00:09

Δεν έχω καταλάβει το πρόβλημα σου. Δηλαδή έχεις θέμα με το πως θα κάνεις order;

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από giannis17 » 08 Ιαν 2013 00:13

Έτσι όπως το έχεις γράψει τώρα βρίσκει σε πόσες ομάδες ανήκει ο μαθητής και για κάθε ομάδα εμφανίζει το σύνολο των Quiz που ανήκουν σε αυτή την ομάδα και όσα δεν ανήκουν σε κάποια ομάδα, στη δεύτερη ομάδα που ανήκει ο μαθητής πάλι τα quiz της και τα ανεξάρτητα κ.ο.κ. με αποτέλεσμα να επαναλαμβάνονται τα ανεξάρτητα και φυσικά όσα Quiz υπήρχαν σε πολλές ομάδες του ίδιου μαθητή ταυτόχρονα (το τελευταίο είναι λίγο δύσκολο να διορθωθεί αλλά γίνεται).

Επίσης με μπερδεύει λίγο το id_omad που χρησιμέυει αλλά τέλος πάντων...

Ο πιο σωστός τρόπος να γίνει είναι με Join:

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

SELECT * FROM quiz INNER JOIN omades_xristwn ON quiz.id_omadas = omades_xristwn.id_omadas OR quiz.id_omadas = '0' ORDER BY date ASC
Έτσι θα έχεις όλα τα δεδομένα σε ένα result δεν χρειάζεται 2ο while.

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 00:14

βασικά βρίσκομαι σε αρχικό στάδιο.. δεν είμαι έμπειρος στον προγραμματισμό ιστοσελίδων γενικά και μπερδεύομαι σε κάποια πράματα. Θέλω τα αποτελέσματα όλα να εμφανίζονται μαζί. δηλαδή και αυτά στα οποία υπάρχει κάποιο id_omadas στο quiz και αυτά στα οποία το id_omadas είναι 0 να εμφανίζονται όλα μαζί το ένα κάτω από το άλλο. Ίσως να ήταν πιο εύκολο να τα έχω ξεχωριστά σε 2 ξεχωριστούς πίνακες αλλά έτσι μου ζητήθηκε.

Γιάννη θα το δοκιμάσω και θα ενημερώσω.. ευχαριστώ!
miteletsis

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 00:17

Γιάννη υπάρχουν 2 κατηγορίες quiz αυτά που δημιουργούνται και ανήκουν σε κάποια ομάδα χρηστών (γι αυτό και το id_omadas συνδέει τον πίνακα quiz με τον πίνακα που συσχετίζει ποιοι μαθητές ανήκουν σε ποια ομάδα) και αυτά που είναι ελεύθερα (με id_omadas 0) και μπορούν να τα παίξουν όλοι οι μαθητές ανεξαρτήτως αν ανήκουν σε κάποια ομάδα ή όχι
miteletsis

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 00:26

το έφτιαξα έτσι $result=mysql_query("SELECT * FROM quiz INNER JOIN omades_xristwn ON quiz.id_omadas = omades_xristwn.id_omadas OR quiz.id_omadas = '0' AND omades_xristwn.student_id='".user_id."' ORDER BY date ASC"); για να αφορά τον μαθητή που του προορίζονται τα τεστ.. δυστυχώς πάλι εμφανίζει τις εγγραφές άλλες 6 φορές, άλλες 3, άλλες 4 φορές αναλόγως..

προσπάθησα και με duplicate αλλά τπτ.
miteletsis

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από giannis17 » 08 Ιαν 2013 00:50

ωχ ναι έχεις δίκιο ξέχασα να βάλω το user_id μέσα.

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

SELECT * FROM quiz INNER JOIN omades_xristwn ON quiz.id_omadas = omades_xristwn.id_omadas OR quiz.id_omadas = '0' where quiz.user_id ='".$user_id."' ORDER BY date ASC
όπως το είχα γράψει πριν θα έδειχνε όλα τα quiz ανεξαρτήτου χρήστη
"There is only one problem with common sense; it’s not very common."
&#8211; Milt Bryce

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 00:57

όπως το έγραψες απλά θέλω το student_id από τον πίνακα omades_xristwn να ισούτε με το user_id. έτσι δηλαδή:

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

$result=mysql_query&#40;"SELECT * FROM quiz INNER JOIN omades_xristwn ON quiz.id_omadas = omades_xristwn.id_omadas OR quiz.id_omadas = '0' where omades_xristwn.student_id ='".$user_id."' ORDER BY date ASC"&#41;;
τώρα μου εμφανίζει σωστά όλες τις εγγραφές που έχει το quiz κάποιο id_omadas και μου εμφανίζει καμιά 7 φορές την μια εγγραφή που έχω με id_omadas 0 στον πίνακα quiz!

Οι σωστές εγγραφές που έχουν κάποιο id_omadas είναι 8 και 7 φορές εμφανίζεται η μια που δεν έχει id_omadas, που είναι δηλαδή 0
miteletsis

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 01:39

Οκ το έφτιαξα έτσι:

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

$result=mysql_query&#40;"SELECT DISTINCT quiz.id_omadas, quiz.* FROM quiz INNER JOIN omades_xristwn ON quiz.id_omadas = omades_xristwn.id_omadas OR quiz.id_omadas = '0' where omades_xristwn.student_id ='".$user_id."' ORDER BY date ASC"&#41;;
ευχαριστώ πολύ για την βοήθεια φίλε μου!!
miteletsis

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 11:27

Καλημέρα και πάλι. αντιμετωπίζω πρόβλημα σε ένα τελευταία ερώτημα αλλά δεν ήθελα να δημιουργήσω πάλι ένα καινούργιο θέμα.

Η περίπτωση μου είναι η εξής:

Έχω έναν πίνακα όπου αποθηκεύονται οι ερωτήσεις ενός τεστ:

questions (question_id, key1, key2, key3, key4, user_id, creation_date, taksi, type, permission )

και τον πίνακα:

questions_keys (question_key_id, question_key_name, question_key_refers_to)

Στον πίνακα questions αποθηκεύονται σε κάθε key (key1-key4) τα question_key_id από τον πίνακα questions_keys. Κάθε ερώτηση που δημιουργώ μπορεί να ανήκει από 2 έως και 4 θέματα. Σε περίπτωση που κάποια ερώτηση ανήκει σε 4 θέματα, έχουν δηλαδή όλα τα keys στον πίνακα questions κάποιο id μέσα δουλεύει σωστά, αναλόγως το id που έχω στα key1-key4 εμφανίζεται το question_key_name από τον πίνακα questions_keys και κάνω το όνομα update σωστά. Το πρόβλημα έρχεται σε περίπτωση που κάποια ερώτηση δεν έχει id στα key3 ή key4 που δεν είναι υποχρεωτικά και εχει σαν τιμή εκεί μέσα 0. Οπότε δεν μου εμφανίζονται αυτές οι εγγραφές.

Εδώ είναι η προσπάθεια μου:

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

$myData = mysql_query&#40;'Select qk3.question_key_refers_to as qk3_3, qk4.question_key_refers_to as qk3_4,qk1.question_key_name as p1onoma, qk2.question_key_name as p2onoma, qk3.question_key_name as p3onoma,
qk4.question_key_name as p4onoma, q.type, q.creation_date, q.key1, q.key2, q.key3, q.key4, q.taksi,q.question_id,q.permission from questions q inner join questions_keys qk1 on q.key1 = qk1.question_key_id
inner join questions_keys qk2 on q.key2 = qk2.question_key_id inner join questions_keys qk3 on q.key3 = qk3.question_key_id
inner join questions_keys qk4 on q.key4 = qk4.question_key_id'&#41;;

<?php while&#40;$row = mysql_fetch_array&#40;$myData, MYSQL_ASSOC&#41;&#41;&#123;?>
    <tbody>
<?php

echo '<tr id="row_'.$row&#91;'question_id'&#93;.'">';
echo '<td align=center><input type="text" name="question_key_name1" id="question_key_name1_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'p1onoma'&#93; . '" size=10/></td>';
echo '<input type="hidden" name="key1" id="key1_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'key1'&#93; . '" size=5/>';

echo '<td align=center><input type="text" name="question_key_name2" id="question_key_name2_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'p2onoma'&#93; . '" size=10/></td>';
echo '<input type="hidden" name="key2" id="key2_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'key2'&#93; . '" size=5/>';
if &#40;&#40;$row&#91;'qk3_3'&#93; == 0&#41; && &#40;$row&#91;'key3'&#93; == 0&#41;&#41; &#123;

echo '<td align=center>'.$row&#91;'key3'&#93;.'</td>';


&#125; else &#123;
echo '<td align=center><input type="text" name="question_key_name3" id="question_key_name3_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'p3onoma'&#93; . '" size=10/></td>';
echo '<input type="hidden" name="key3" id="key3_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'key3'&#93; . '" size="5"/>';
&#125;
if &#40;&#40;$row&#91;'qk3_4'&#93; == 0&#41; && &#40;$row&#91;'key4'&#93; == 0&#41;&#41;&#123;

echo '<td align=center>'.$row&#91;'key4'&#93;.'</td>';


&#125; else &#123;
echo '<td align=center><input type="text" name="question_key_name4" id="question_key_name4_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'p4onoma'&#93; . '" size=10/></td>';
echo '<input type="hidden" name="key4" id="key4_'.$row&#91;'question_id'&#93;.'" style="text-align&#58; center" value="' . $row&#91;'key4'&#93; . '" size="5"/>';
&#125;
echo '<td align=center>
<SELECT name=taksi class="field" id="taksi_'.$row&#91;'question_id'&#93;.'">';?>

<OPTION VALUE="1"<?php if &#40;$row&#91;'taksi'&#93; == 1&#41; &#123; echo ' selected="selected"'; &#125; ?>>Α' Δημοτικού
<OPTION VALUE="2" <?php if &#40;$row&#91;'taksi'&#93; == 2&#41; &#123; echo ' selected="selected"'; &#125; ?>>Β' Δημοτικού
<OPTION VALUE="3" <?php if &#40;$row&#91;'taksi'&#93; == 3&#41; &#123; echo ' selected="selected"'; &#125; ?>>Γ' Δημοτικού
<OPTION VALUE="4" <?php if &#40;$row&#91;'taksi'&#93; == 4&#41; &#123; echo ' selected="selected"'; &#125; ?>>Δ' Δημοτικού
<OPTION VALUE="5" <?php if &#40;$row&#91;'taksi'&#93; == 5&#41; &#123; echo ' selected="selected"'; &#125; ?>>Ε' Δημοτικού
<OPTION VALUE="6" <?php if &#40;$row&#91;'taksi'&#93; == 6&#41; &#123; echo ' selected="selected"'; &#125; ?>>ΣΤ' Δημοτικού
</SELECT>
<?php echo '</td>';

echo '<td align=center>
<SELECT name=permission class="field" id="permission_'.$row&#91;'question_id'&#93;.'">';?>
<OPTION VALUE="0"<?php if &#40;$row&#91;'permission'&#93; == 0&#41; &#123; echo ' selected="selected"'; &#125; ?>>ΝΑΙ
<OPTION VALUE="1"<?php if &#40;$row&#91;'permission'&#93; == 1&#41; &#123; echo ' selected="selected"'; &#125; ?>>ΟΧΙ
</SELECT>
<?php echo '</td>';
miteletsis

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από giannis17 » 08 Ιαν 2013 18:37

Λογικό είναι, του λες να συνδυάζει και τα 4 keys και να σου δίνει τα κοινά, αν κάποιο key είναι λάθος/κενό δεν παίρνεις αποτέλεσμα. Πρέπει να χωρίσεις τα INNER JOIN με OR μεταξύ τους και στην αρχή μετά το SELECT να προσθέσεις το DISTINCT για να μη στα εμφανίζει 4 φορές.

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 19:28

Προσπάθησα να το κάνω αυτό που λες αλλά δεν μου εμφανίζει κανένα αποτέλεσμα, μπορείς να μου αλλάξεις το ερώτημα έστω στο περίπου για να καταλάβω τι γίνεται? εγώ έβαλα OR πριν από τα 2 τελευταία inner join και distinct μετά την πρώτη select
miteletsis

Άβαταρ μέλους
dimos_mitel
Δημοσιεύσεις: 280
Εγγραφή: 07 Αύγ 2009 21:06
Επικοινωνία:

Πρόβλημα σε ερωτήματα

Δημοσίευση από dimos_mitel » 08 Ιαν 2013 20:09

Οκ, η λύση στην τελευταία μου ερώτηση ήταν αυτή. Χρησιμοποίησα αντί τα 2 τελευταία inner join, left outer join.
miteletsis

Απάντηση

Επιστροφή στο “MySQL”

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

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