проблем с JOIN заявка

PHP_Masters

Registered
Здравейте на всички, имам следния проблем правя нещо като вотинг система, в която само потребители могат да гласуват. Та проблема ми е как да изкарам категориите и под всяка една категория съотвените въпроси към тази категория, имам следните таблици

vot_cat - таблицата която съдържа категориите на въпросите
| cat_id | cat_name |
| 1 | Question 1 |
| 2 | Question 2 |

vot_c-тази съдържа самите възможности за избор
| id | name | cat_id | vots |
| 1 | Choose 1 | 1 | 123 |
| 2 | Choose 2 | 1 | 123 |
| 3 | Choose 3 | 1 | 123 |
| 4 | Choose 1 a | 2 | 123 |
| 5 | Choose 2 b | 2 | 123 |
| 6 | Choose 3 v | 2 | 123 |

И зявката която успях да се сетя е следната, но не мисля, че ще свърши това което искам

Код:
SELECT * FROM vot_cat JOIN vot_c ON(vot_cat.cat_id=vot_c.cat_id)

И, за да няма някой който не е на ясно искам да изведа резултата от заявката по следния начин

| Question 1 |
---------------------
| Choose 1 |
---------------------
| Choose 2 |
---------------------
| Choose 3 |
---------------------

| Question 2 |
---------------------
| Choose 1 a |
---------------------
| Choose 2 b |
---------------------
| Choose 3 v |
---------------------

Благодаря предварително :)
 
PHP:
<?php
$db = new mysqli('localhost', '...', '...', '...');

$questionsQuery = $db->query('SELECT `cat_id`, `cat_name` FROM `vot_cat`'); // взимаме всички questions
$choicesQuery   = $db->query('SELECT `id`, `cat_id`, `name`, `vots` FROM `vot_c`'); // взимаме всички choices

for($choices = []; $choice = $choicesQuery->fetch_object(); $choices[] = $choice); // вкарваме резултатите от $choicesQuery в $choices

while($question = $questionsQuery->fetch_object()) { // въртим questions
	echo $question->cat_name . PHP_EOL; // изкарваме question name
	foreach($choices as $cid => $choice) { // въртим choices
		if($choice->cat_id === $question->cat_id) { // проверяваме дали някой choice е от текущия question
			echo ' -- ' . $choice->name . PHP_EOL;
			unset($choices[$cid]); // махаме го от масива, за да не се обхожда пак
		}
	}
	echo PHP_EOL; // просто нов ред :)
}

Изкарва:

Код:
Question 1
 -- Choose 1
 -- Choose 2
 -- Choose 3

Question 2
 -- Choose 1a
 -- Choose 2b
 -- 3c
 
Човек това е супер, но след доста дълга почивка от програмирането наскоро започнах пак да се образовам така да се каже и все още съм на ниво процедурен код, а не ООП, и бих искал да схвана самата логика на кода, ще бъде супер ако може да го напишеш с процедурен код, защото тези редове изобщо не мога да ги схвана
 
ами заявките ги имаш. изкарваме всичко от questions и всичко от choices. какво става:

вкарвам резултатите от $choicesQuery в масив $choices.

почвам да обхождам резултатите от заявката $questionsQuery.

- изкарвам името на question
- почвам да обхождам масива с $choices и проверявам дали съвпада cat_id:
- - ако съвпада:
- - - изкарвам името на choice
- - - изтривам го от масив $choice (за да не го обхожда пак)

ами това е :) Според мен с обяснения по-добре, пък възможно е ти ползваш базата данни по друг начин. Ако все пак не ти е ясно, кажи.

За да достъпваш нещата като с масив ($question['cat_name'] вместо $question->cat_name), замести ->fetch_object със ->fetch_assoc

Направих малка промяна горе и коментирах всеки ред :)
 
Благодаря ти, схванах идеята.Предполагам, че с 1 заявка няма как да стане, след като предлагаш такова решение?
 
Ами като помислих ето друг вариант, с една заявка:

[sql]SELECT q.cat_name, q.cat_id, GROUP_CONCAT( c.name SEPARATOR ',' ) AS choices
FROM vot_cat q
INNER JOIN vot_c c ON q.cat_id = c.cat_id
GROUP BY c.cat_id[/sql]

Код:
mysql> SELECT q.cat_name, q.cat_id, GROUP_CONCAT( c.name SEPARATOR ',' ) AS choices
    -> FROM vot_cat q
    -> INNER JOIN vot_c c ON q.cat_id = c.cat_id
    -> GROUP BY c.cat_id;
+------------+--------+----------------------------+
| cat_name   | cat_id | choices                    |
+------------+--------+----------------------------+
| Question 1 |      1 | Choose 2,Choose 3,Choose 1 |
| Question 2 |      2 | 3c,Choose 1a,Choose 2b     |
+------------+--------+----------------------------+
2 rows in set (0.00 sec)

като можеш да промениш символа, с който да ги разделяш,
и после с един explode(',', $row['choices'])

PHP:
while($row = $query->fetch_assoc()) {
	echo $row['cat_name'] . PHP_EOL;
	$choices = explode(',', $row['choices']);
	foreach($choices as $choice) {
		echo ' -- ' . $choice . PHP_EOL;
	}
	echo PHP_EOL;
}
 

Back
Горе