Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не могу решить поставленную задачу, уже 2 дня не могу понять как, все перепробывал
 
 автор: tetron   (29.01.2012 в 08:49)   письмо автору
 
 


Есть 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]";
                }
        }
        
?>

  Ответить  
 
 автор: Valick   (29.01.2012 в 09:17)   письмо автору
 
   для: tetron   (29.01.2012 в 08:49)
 

ай-яй, есть одна деталька, если у вас запрос в цикле, то где-то 90% того, что вы что-то делаете не правильно. А именно пытаетесь работать с базой данных средствами РНР.
Раскажите подробнее что нужно получить в конечном результате и дайте подробное описание таблиц и типов полей в них
___
для вопросов по MySQL есть соответсвующий раздел

  Ответить  
 
 автор: tetron   (29.01.2012 в 12:04)   письмо автору
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) в каждом упражнении за вычетом категорий которые отобразились (чебокс с галкой). И итоге должно получиться примерно как на скриншоте (справа)

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 10:39)   письмо автору
 
   для: tetron   (29.01.2012 в 08:49)
 

А что у вас интерпретатор не ругается на этот код????
Тогда включите показ ошибок
error_reporting(E_ALL);
И вы увидите, что вот тут:
<?
"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)");

  Ответить  
 
 автор: tetron   (29.01.2012 в 11:03)   письмо автору
 
   для: Sfinks   (29.01.2012 в 10:39)
 

"А что у вас интерпретатор не ругается на этот код????"
не ругается, в php.ini (соответствующая строка раскоментирована)


echo "$show_category_on_row[category_id]";
echo"$show_category_off_row[title]";
Внутри кавычек был html код (временно удалил его)

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 11:35)   письмо автору
 
   для: tetron   (29.01.2012 в 11:03)
 

>не ругается, в php.ini (соответствующая строка раскоментирована)
что, в пхп.ини есть строка разрешающая писать массивы внутри строк? Или вы про строку которая отвечает за вывод ошибок? Если второе, то вы просто ошибок не видите, но код работает не правильно.

Так а про решение что? Работает или нет?

  Ответить  
 
 автор: tetron   (29.01.2012 в 12:00)   письмо автору
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) в каждом упражнении за вычетом категорий которые отобразились (чебокс с галкой). И итоге должно получиться примерно как на скриншоте (справа)

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 12:32)   письмо автору
 
   для: tetron   (29.01.2012 в 12:00)
 

А как у Вас пресс отметился? Жим штанги лежа на горизонтальной скамье это ид 77? Тогда не плечи и руки должны быть разве?

  Ответить  
 
 автор: tetron   (29.01.2012 в 12:37)   письмо автору
 
   для: Sfinks   (29.01.2012 в 12:32)
 

вставил для примера (сделал, для наглядности). поправлю.

Я могу отобразить только те категории которые есть в таблице №2, а вот как другие отобразить не знаю как сделать

  Ответить  
 
 автор: Valick   (29.01.2012 в 12:48)   письмо автору
 
   для: 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 />";
}
?> 

естетственно установите соединение со своей базой сначала

  Ответить  
 
 автор: tetron   (29.01.2012 в 12:46)   письмо автору
87.7 Кб
 
   для: tetron   (29.01.2012 в 12:00)
 

перезалил

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 13:09)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 12:48)   письмо автору
 
   для: 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)");  
на тот который я написал. Должно быть то что надо.

  Ответить  
 
 автор: Valick   (29.01.2012 в 12:51)   письмо автору
 
   для: Sfinks   (29.01.2012 в 12:48)
 

внимательно посмотрите мой ответ чуть выше
задача решается двумя запросами при любом количестве данных в базе
если запросы засовывать в цикл, то их количество будет расти в геометрической прогрессии от количества данных

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 13:17)   письмо автору
 
   для: Valick   (29.01.2012 в 12:51)
 

И что, если надо перебрать каждый вид упражнений? Давайте застрелимся, но чтоб нагрузки не было. Я выше написал, как по каждому ид упражнения одним запросом (и то с подзапросом, т.е. на уровне БД это снова 2 запроса) получить группы мышц на которые это упражнение не влияет, но это все-равно придется делать в цикле для каждого ид! Или вы сможете написать запрос который сразу выдаст:

жим штанги лежа не действует на
-грудь
-спина
-пресс
-ноги
жим штанги на наклонной скамье не действует на
-плечи
-руки
-спина
-пресс
-ноги
С удовольствием посмотрю на такой запрос!

  Ответить  
 
 автор: tetron   (29.01.2012 в 13:30)   письмо автору
 
   для: Sfinks   (29.01.2012 в 13:17)
 

Вывод не для пользователей, а для администратора - чтобы он мог посмотреть все упражнений и настроить их. На какие мышцы действует а на какие нет.

  Ответить  
 
 автор: tetron   (29.01.2012 в 13:46)   письмо автору
 
   для: Sfinks   (29.01.2012 в 13:17)
 

Спасибо за ваш код, работает - буду дальше изучать php+mysql в практике

  Ответить  
 
 автор: Valick   (29.01.2012 в 16:56)   письмо автору
 
   для: 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($res10);
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>";
}
?> 

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 17:28)   письмо автору
 
   для: Valick   (29.01.2012 в 16:56)
 

Если это то что нужно, значит я не понял задачу. Это называется не "выбрать то чего нет", а "выбрать все и в этом отметить то что есть". А я то составлял массив того что есть, и массив того чего нет. Думал оно нужно для дальнейшей обработки. Этого не в цикле не сделаешь.

  Ответить  
 
 автор: Valick   (29.01.2012 в 17:34)   письмо автору
 
   для: Sfinks   (29.01.2012 в 17:28)
 

я ориентировался на скриншот, и решал задачу с самого начала
автор просил решить её с середины не понимая что изначально пошёл не по тому пути, вот и всплывала эта вся путиница
__
Этого не в цикле не сделаешь.
можно и нужно делать без цикла

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 13:53)   письмо автору
 
   для: 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>
Это по моему мнению минимальная нагрузка при данной задаче!

Результат:
жим штанги лежа
  Влияет на:
    -плечи
    -руки
  Не влияет на:
    -грудь
    -спина
    -пресс
    -ноги
жим штанги на наклонной скамье
  Влияет на:
    -грудь
  Не влияет на:
    -плечи
    -руки
    -спина
    -пресс
    -ноги

  Ответить  
 
 автор: tetron   (29.01.2012 в 14:06)   письмо автору
 
   для: 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>";
                    }
        }
?>


Работает как и хотел, сейчас попробую ваш вариант

  Ответить  
 
 автор: Sfinks   (29.01.2012 в 14:10)   письмо автору
 
   для: 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))

У вас запрос в запросе в запросе. Такая вложенность это перебор.

  Ответить  
 
 автор: tetron   (29.01.2012 в 14:33)   письмо автору
 
   для: Sfinks   (29.01.2012 в 14:10)
 

Не задумывался на этим моментом - сейчас изучаю запросы sql. Буду углубляться в знания чтобы меньше "говнокодить" :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования