|
|
|
|
Есть 3 таблицы MySql
1 - "training_exercises" - здесь названия упражнений + id
2 - "category_exercises" - здесь: id + category_id + exercises_id
3 - "muscle_group" - здесь название мускулов + id
"title" - это названиник категории или упражнения
<?php
// 1) Вытаскиваю id упражнения
$show = mysql_query ("SELECT * FROM `training_exercises`");
while ($show_row = mysql_fetch_array ($show))
{
// 2) Ищу совпадения по ID в таблице "category_exercises и вывожу все которые есть в таблице "category_exercises" по ID "
$show_category_on = mysql_query ("SELECT * FROM `category_exercises` WHERE `exercises_id`='$show_row[id]'");
while ($show_category_on_row = mysql_fetch_array ($show_category_on))
{
echo "$show_category_on_row[category_id]"; // <--- "ЭТО-ТУТ-id"
}
// 4) А вот тут проблема как мне, вывести названия из таблицы "muscle_group" и главное исключить все ид которые отобразились: "<--- "ЭТО-ТУТ-id"
// Категории которых нет в упражнении
$show_category_off = mysql_query ("SELECT * FROM `muscle_group` WHERE `id` NOT IN (СЮДА ВСТАВИТЬ ID ИЗ <--- "ЭТО-ТУТ-id)");
while ($show_category_off_row = mysql_fetch_array($show_category_off))
{
echo"$show_category_off_row[title]";
}
}
?>
|
| |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 08:49)
| | ай-яй, есть одна деталька, если у вас запрос в цикле, то где-то 90% того, что вы что-то делаете не правильно. А именно пытаетесь работать с базой данных средствами РНР.
Раскажите подробнее что нужно получить в конечном результате и дайте подробное описание таблиц и типов полей в них
___
для вопросов по MySQL есть соответсвующий раздел | |
|
|
|
|
87.7 Кб |
|
|
для: Valick
(29.01.2012 в 09:17)
| | Подробнее расписал задачу, про ваш пример (не совсем понял его логику - может я расписал неправильно, но попробовал - не работает)
Приложил скриншот, что хотел сделать.
Слева направо:
№1 таблица - что-то вроде категорий сайта
№2 таблица - соединяет 1 и 3 таблицы (сделано для того чтобы разместить упражнения в несколько категорий)
№3 таблица - упражнения
1) Делаю запрос в базу в таблицу №3 - в цикле собираю все ID упражнений.
2) Запрос в таблицу №2 - нахожу совпадения (в "exercises_id") - в цикле собираю все "category_id"
3) Запрос в таблицу №1 - в цикле по "category_id" - вывожу из таблицы №1 "Название упражнения"
В итоге у меня: отобразились по каждому Упражнению "id" категорий в которых есть эти Упражнения (на скриншоте это чебоксе с галкой)
Вопрос: как мне отобразить все категории (табл №1) в каждом упражнении за вычетом категорий которые отобразились (чебокс с галкой). И итоге должно получиться примерно как на скриншоте (справа) | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 08:49)
| | А что у вас интерпретатор не ругается на этот код????
Тогда включите показ ошибок И вы увидите, что вот тут:
<?
"SELECT * FROM `category_exercises` WHERE `exercises_id`='$show_row[id]'"
// должно быть как минимум
"SELECT * FROM `category_exercises` WHERE `exercises_id`='{$show_row[id]}'"
// а лучше
"SELECT * FROM `category_exercises` WHERE `exercises_id`='{$show_row["id"]}'"
// или
"SELECT * FROM `category_exercises` WHERE `exercises_id`='".$show_row["id"]."'"
| а вот тут
<?
echo "$show_category_on_row[category_id]";
echo"$show_category_off_row[title]";
| вообще не понятно зачем кавычки.
Исправьте для начала, посмотрите что изменится.
А вообще можно так изменить
<?
$not_needed_id = array();
while ($show_category_on_row = mysql_fetch_array ($show_category_on)) {
echo $show_category_on_row["category_id"];
$not_needed_id[] = $show_category_on_row["category_id"];
}
$not_needed_id = implode(",",$not_needed_id);
$show_category_off = mysql_query ("SELECT * FROM `muscle_group` WHERE `id` NOT IN ($not_needed_id)");
|
| |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 10:39)
| | "А что у вас интерпретатор не ругается на этот код????"
не ругается, в php.ini (соответствующая строка раскоментирована)
echo "$show_category_on_row[category_id]";
echo"$show_category_off_row[title]";
Внутри кавычек был html код (временно удалил его) | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 11:03)
| | >не ругается, в php.ini (соответствующая строка раскоментирована)
что, в пхп.ини есть строка разрешающая писать массивы внутри строк? Или вы про строку которая отвечает за вывод ошибок? Если второе, то вы просто ошибок не видите, но код работает не правильно.
Так а про решение что? Работает или нет? | |
|
|
|
|
92.5 Кб |
|
|
для: Sfinks
(29.01.2012 в 11:35)
| | раскоментирована строка за вывод всех ошибок
Подробнее расписал задачу, про ваш пример (не совсем понял его логику - может я расписал неправильно, но попробовал - не работает)
Приложил скриншот, что хотел сделать.
Слева направо:
№1 таблица - что-то вроде категорий сайта
№2 таблица - соединяет 1 и 3 таблицы (сделано для того чтобы разместить упражнения в несколько категорий)
№3 таблица - упражнения
1) Делаю запрос в базу в таблицу №3 - в цикле собираю все ID упражнений.
2) Запрос в таблицу №2 - нахожу совпадения (в "exercises_id") - в цикле собираю все "category_id"
3) Запрос в таблицу №1 - в цикле по "category_id" - вывожу из таблицы №1 "Название упражнения"
В итоге у меня: отобразились по каждому Упражнению "id" категорий в которых есть эти Упражнения (на скриншоте это чебоксе с галкой)
Вопрос: как мне отобразить все категории (табл №1) в каждом упражнении за вычетом категорий которые отобразились (чебокс с галкой). И итоге должно получиться примерно как на скриншоте (справа) | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 12:00)
| | А как у Вас пресс отметился? Жим штанги лежа на горизонтальной скамье это ид 77? Тогда не плечи и руки должны быть разве? | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 12:32)
| | вставил для примера (сделал, для наглядности). поправлю.
Я могу отобразить только те категории которые есть в таблице №2, а вот как другие отобразить не знаю как сделать | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 12:37)
| | как можно отобразить то чего нет? :))
для начала запустите вот такой код и сравните со своим:
<?php
include('conect.php');
$query="SELECT *
FROM category_exercises c
JOIN training_exercises t
JOIN muscle_group m
ON t.id=c.exercises_id AND m.id=category_id";
$res=mysql_query($query);
while($r=mysql_fetch_assoc($res)){
echo $r[exercises_title]." - ".$r[title]."<br />";
}
?>
|
естетственно установите соединение со своей базой сначала | |
|
|
|
|
87.7 Кб |
|
|
для: tetron
(29.01.2012 в 12:00)
| | перезалил | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 12:46)
| | Сам не ожидал, но вот такой запрос работает именно так как вам надо =)
SELECT title
FROM muscle_group t1
LEFT JOIN (SELECT * FROM category_exercises WHERE exercises_id=79) b
ON t1.id = b.category_id
WHERE b.id IS NULL
|
| |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 12:00)
| | > не совсем понял его логику - может я расписал неправильно, но попробовал - не работает
Логика такая: в вашем исходном коде заменить фрагмент
<?
while ($show_category_on_row = mysql_fetch_array ($show_category_on))
{
echo "$show_category_on_row[category_id]"; // <--- "ЭТО-ТУТ-id"
}
// 4) А вот тут проблема как мне, вывести названия из таблицы "muscle_group" и главное исключить все ид которые отобразились: "<--- "ЭТО-ТУТ-id"
// Категории которых нет в упражнении
$show_category_off = mysql_query ("SELECT * FROM `muscle_group` WHERE `id` NOT IN (СЮДА ВСТАВИТЬ ID ИЗ <--- "ЭТО-ТУТ-id)");
| на тот который я написал. Должно быть то что надо. | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 12:48)
| | внимательно посмотрите мой ответ чуть выше
задача решается двумя запросами при любом количестве данных в базе
если запросы засовывать в цикл, то их количество будет расти в геометрической прогрессии от количества данных | |
|
|
|
|
|
|
|
для: Valick
(29.01.2012 в 12:51)
| | И что, если надо перебрать каждый вид упражнений? Давайте застрелимся, но чтоб нагрузки не было. Я выше написал, как по каждому ид упражнения одним запросом (и то с подзапросом, т.е. на уровне БД это снова 2 запроса) получить группы мышц на которые это упражнение не влияет, но это все-равно придется делать в цикле для каждого ид! Или вы сможете написать запрос который сразу выдаст:
жим штанги лежа не действует на
-грудь
-спина
-пресс
-ноги
жим штанги на наклонной скамье не действует на
-плечи
-руки
-спина
-пресс
-ноги
| С удовольствием посмотрю на такой запрос! | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 13:17)
| | Вывод не для пользователей, а для администратора - чтобы он мог посмотреть все упражнений и настроить их. На какие мышцы действует а на какие нет. | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 13:17)
| | Спасибо за ваш код, работает - буду дальше изучать php+mysql в практике | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 13:17)
| | как я и говорил всего два запроса:
<?php
include('conect.php');
$query1="SELECT * FROM muscle_group";
$res1=mysql_query($query1);
$query2="SELECT *
FROM category_exercises c
JOIN training_exercises t
JOIN muscle_group m
ON t.id=c.exercises_id AND m.id=category_id";
$res2=mysql_query($query2);
while($r2=mysql_fetch_assoc($res2)){
$title[$r2[exercises_id]]=$r2[exercises_title];
$exe[$r2[exercises_id]][$r2[category_id]]=$r2[title];
}
foreach($title as $key=>$value){
echo "<form action=sel.php method=post>";
echo $value."<br />";
mysql_data_seek($res1, 0);
while($r1=mysql_fetch_assoc($res1)){
echo "<input type=checkbox name=ch[$key][$r1[id]] value=$r1[title]";
if(isset($exe[$key][$r1[id]])) echo " checked>"; else echo ">";
echo " ".$r1[title]."<br />";
}
echo "<input type=submit value=сохранить>";
echo "</form>";
}
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(29.01.2012 в 16:56)
| | Если это то что нужно, значит я не понял задачу. Это называется не "выбрать то чего нет", а "выбрать все и в этом отметить то что есть". А я то составлял массив того что есть, и массив того чего нет. Думал оно нужно для дальнейшей обработки. Этого не в цикле не сделаешь. | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 17:28)
| | я ориентировался на скриншот, и решал задачу с самого начала
автор просил решить её с середины не понимая что изначально пошёл не по тому пути, вот и всплывала эта вся путиница
__
Этого не в цикле не сделаешь.
можно и нужно делать без цикла | |
|
|
|
|
|
|
|
для: Valick
(29.01.2012 в 12:51)
| | А так как первый запрос (группы мышц на которые влияет упражнение) все-равно нужно делать, то второй запрос (не влияет) лучше упростить и сделать без подзапросов, так как было указано в первом посте. В общем вот что я нарисовал:
<pre><?php
$res = mysql_query("SELECT * FROM `training_exercises`");
while($exerciss = mysql_fetch_array($res)){
echo $exerciss["exercises_title"]."\n Влияет на:\n";
$res1 = mysql_query("SELECT `muscle_group`.`id` as `id`, `muscle_group`.`title` as `title`
FROM `muscle_group`, `category_exercises`
WHERE `muscle_group`.`id` = `category_exercises`.`category_id`
AND `category_exercises`.`exercises_id` = ".$exerciss["id"]);
$not_neded_id = array();
while($muscle = mysql_fetch_array($res1)){
$not_neded_id[] = $muscle["id"];
echo " -{$muscle["title"]}\n";
}
$not_neded_id = implode(",",$not_neded_id);
echo " Не влияет на:\n";
$res2 = mysql_query("SELECT `title` FROM `muscle_group` WHERE `id` NOT IN ($not_neded_id)");
while($muscle = mysql_fetch_array($res2))
echo " -{$muscle["title"]}\n";
}
?></pre>
| Это по моему мнению минимальная нагрузка при данной задаче!
Результат:
жим штанги лежа
Влияет на:
-плечи
-руки
Не влияет на:
-грудь
-спина
-пресс
-ноги
жим штанги на наклонной скамье
Влияет на:
-грудь
Не влияет на:
-плечи
-руки
-спина
-пресс
-ноги
|
| |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 13:53)
| | С некоторыми модификациями из первого вашего варианта сделал так:
<?php
session_start();
require "../protection/protection.php";
require "../settings/db.php";
$show = mysql_query ("SELECT * FROM `training_exercises`");
while ($show_row = mysql_fetch_array ($show))
{
echo "<div><h3>$show_row[exercises_title]</h1></div>";
$show_category_on = mysql_query ("SELECT * FROM `category_exercises` WHERE `exercises_id`='".$show_row[id]."'");
$not_needed_id = array();
while ($show_category_on_row = mysql_fetch_array ($show_category_on))
{
$show_category_mg = mysql_query ("SELECT * FROM `muscle_group` WHERE `id`='".$show_category_on_row[category_id]."'");
while ($show_category_mg_row = mysql_fetch_array($show_category_mg))
{
echo"<div>$show_category_mg_row[title]<input name='' type='checkbox' value='' checked /></div>";
}
$not_needed_id[] = $show_category_on_row["category_id"];
}
$not_needed_id = implode(",",$not_needed_id);
$show_category_off = mysql_query ("SELECT * FROM `muscle_group` WHERE `id` NOT IN ($not_needed_id)");
while ($show_category_off_row = mysql_fetch_array($show_category_off))
{
echo"<div>$show_category_off_row[title] - <input name='' type='checkbox' value='' /></div>";
}
}
?>
|
Работает как и хотел, сейчас попробую ваш вариант | |
|
|
|
|
|
|
|
для: tetron
(29.01.2012 в 14:06)
| | Вот судя по всему про это вам Valick и писал:
<?
$show = mysql_query ("SELECT * FROM `training_exercises`");
while ($show_row = mysql_fetch_array ($show))
{
echo "<div><h3>$show_row[exercises_title]</h1></div>";
$show_category_on = mysql_query ("SELECT * FROM `category_exercises` WHERE `exercises_id`='".$show_row[id]."'");
$not_needed_id = array();
while ($show_category_on_row = mysql_fetch_array ($show_category_on))
{
$show_category_mg = mysql_query ("SELECT * FROM `muscle_group` WHERE `id`='".$show_category_on_row[category_id]."'");
while ($show_category_mg_row = mysql_fetch_array($show_category_mg))
|
У вас запрос в запросе в запросе. Такая вложенность это перебор. | |
|
|
|
|
|
|
|
для: Sfinks
(29.01.2012 в 14:10)
| | Не задумывался на этим моментом - сейчас изучаю запросы sql. Буду углубляться в знания чтобы меньше "говнокодить" :) | |
|
|
|