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

Форум MySQL

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

 

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

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

тема: Последовательный обход таблиц
 
 автор: Slo_Nik   (31.05.2011 в 20:04)   письмо автору
 
 

Добрый вечер.
Есть таблица, где хранится информация по фирмам. Так же есть ещё три таблицы, где хранится информация по акциям, товарам и новостям для каждой фирмы.
Задача состоит в том, что если фирма блокируется для просмотра на сайте надо заблокировать акции, товары и новости для этой фирмы.
Пробовал обойти таблицы и получить информацию через JOIN, но результат получил не тот, который ожидал.
При блокировке фирмы обновляется запись в таблице фирм, после успешного выполнения запроса идёт обращение к остальным трём таблицам для получения информации на наличие данных.
Получается, что если для фирмы есть одна акция и один товар, но две новости, то данные дублируются.
Вот сам запрос.(связь между таблицами через id фирмы)


   $query = "SELECT `action`.`id_action` AS `id_action`,
                                      `action`.`nameaction` AS `a_name`,
                                       `news`.`id_news` AS `id_news`,
                                        `news`.`title` AS `n_name`,
                                      `goods`.`id_goods` AS `id_goods`,
                                      `goods`.`namegoods` AS `g_name`
                        FROM(SELECT  `firma`.`id_firm`
                                         FROM `firma`
                                     WHERE `firma`.`id_firm` = ".intval($id_firm)."
                                    ) AS `f`
       LEFT JOIN `action` AS `action` ON(`action`.`id_firm` = `f`.`id_firm`)
       LEFT JOIN `fnews` AS `news` ON(`news`.`id_firm` = `f`.`id_firm`)
       LEFT JOIN `goods` AS `goods` ON(`goods`.`id_firm` = `f`.`id_firm`)
        ";
<?php
/* получаю результат запроса  */
$test mysql_query($query);
 if(!
$test) echo mysql_error()."<br />".mysql_errno();
  while(
$ttest mysql_fetch_assoc($test)){
    echo 
"<pre>";
     
print_r($ttest);
    echo 
"</pre>";
  }
?>
/* акция и товар дублируются */
Array
(
    [id_action] => 24
    [a_name] => Акция для фирмы
    [id_news] => 9
    [n_name] => Первая новость для фирмы
    [id_goods] => 27
    [g_name] => товар для фирмы
)

Array
(
    [id_action] => 24
    [a_name] => Акция для фирмы
    [id_news] => 10
    [n_name] => вторая новость для фирмы
    [id_goods] => 27
    [g_name] => товар для фирмы
)



Подскажите как правильно выполнить эту задачу?
Благодарю откликнувшихся.

  Ответить  
 
 автор: cheops   (31.05.2011 в 22:02)   письмо автору
 
   для: Slo_Nik   (31.05.2011 в 20:04)
 

Сообщите какой результат вы ожидаете, что должен возвращать данный запрос? Уникальные товары? Если да, то добавьте в конце строку GROUP BY `goods`.`id_goods`

  Ответить  
 
 автор: Slo_Nik   (31.05.2011 в 22:40)   письмо автору
 
   для: cheops   (31.05.2011 в 22:02)
 

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

  Ответить  
 
 автор: Slo_Nik   (01.06.2011 в 11:06)   письмо автору
 
   для: cheops   (31.05.2011 в 22:02)
 

так как же всё таки сделать обход таблиц одним запросом, и если значение поля не пустое, то выполнить обновление значения поля?

  Ответить  
 
 автор: Lotanaen   (01.06.2011 в 12:09)   письмо автору
 
   для: Slo_Nik   (01.06.2011 в 11:06)
 

а если с помощью UNION ?

  Ответить  
 
 автор: Slo_Nik   (01.06.2011 в 17:38)   письмо автору
 
   для: Lotanaen   (01.06.2011 в 12:09)
 

переписал запрос с применением UNION

<?php
$query 
"SELECT `id_action`, `nameaction` FROM ".$table_action." WHERE `id_firm` = ".$id_firm."
UNION
SELECT `id_news`, `title` FROM "
.$table_fnews." WHERE `id_firm` = ".$id_firm."
UNION
 SELECT `id_goods`, `namegoods` FROM "
.$table_goods." WHERE `id_firm` = ".$id_firm."";
?>
/* в результате получил */
Array
(
    [action] => 24
    [nameaction] => Акция для объединения таблиц
)

Array
(
    [action] => 25
    [nameaction] => вторая акция для фирмы
)

Array
(
    [action] => 26
    [nameaction] => третья акция для фирмы
)

Array
(
    [action] => 9
    [nameaction] => Новость для объединения таблиц
)

Array
(
    [action] => 10
    [nameaction] => вторая новость для объединения таблиц
)

Array
(
    [action] => 27
    [nameaction] => товар для первой фирмы объединения таблиц
)

всё правильно получил, но вот имена индексов массивов не подходят.
в первых трёх всё парвильно, в четвёртом и пятом должно быть вместо [action] -> [news] и вместо [nameaction] -> [title], а в шестом массиве вместо [action] -> [goods] и вместо [nameaction] -> [namegoods]. В руководстве пока не нашёл как это сделать, подскажите пожалуйста, как сделать так, что бы имена индексов были оригинальными?

p.s. оригинальные названия индексов нужно для определения в какой таблице делать обновление записей

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 09:56)   письмо автору
 
   для: Slo_Nik   (01.06.2011 в 17:38)
 

попробуйте такой вариант запроса:

<?php
$query 
"SELECT `id_action` as idtab, `nameaction` as valuetab, , 1 as typetab FROM ".$table_action." WHERE `id_firm` = ".$id_firm."
UNION
SELECT `id_news` as idtab, `title` as valuetab, , 2 as typetab FROM "
.$table_fnews." WHERE `id_firm` = ".$id_firm."
UNION
 SELECT `id_goods` as idtab, `namegoods` as valuetab, , 3 as typetab FROM "
.$table_goods." WHERE `id_firm` = ".$id_firm."";
?>


и по полю typetab определяйте таблицу

  Ответить  
 
 автор: Slo_Nik   (02.06.2011 в 10:27)   письмо автору
 
   для: Lotanaen   (02.06.2011 в 09:56)
 

Такой вариант я пробовал, результат - "0"

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 10:39)   письмо автору
 
   для: Slo_Nik   (02.06.2011 в 10:27)
 

попробуйте еще так:

<?php
$query 
"SELECT `id_action` as idtab, `nameaction` as valuetab, if(id_action,1,1) as typetab FROM ".$table_action." WHERE `id_firm` = ".$id_firm."
UNION
SELECT `id_news` as idtab, `title` as valuetab, if(id_news,2,2) as typetab FROM "
.$table_fnews." WHERE `id_firm` = ".$id_firm."
UNION
 SELECT `id_goods` as idtab, `namegoods` as valuetab, if(id_goods,3,3) as typetab FROM "
.$table_goods." WHERE `id_firm` = ".$id_firm."";
?>

  Ответить  
 
 автор: Slo_Nik   (02.06.2011 в 11:13)   письмо автору
 
   для: Lotanaen   (02.06.2011 в 10:39)
 

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

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 11:24)   письмо автору
 
   для: Slo_Nik   (02.06.2011 в 11:13)
 

так вы же объединяете запросы - как вам таблицу то выводить с разными полями?

  Ответить  
 
 автор: Slo_Nik   (02.06.2011 в 11:33)   письмо автору
 
   для: Lotanaen   (02.06.2011 в 11:24)
 

Действительно, не подумал, но а псевдонимы столбцов, ведь не срабатывает?

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 11:49)   письмо автору
 
   для: Slo_Nik   (02.06.2011 в 11:33)
 

если псевдонимы идентичны во всех объединенных запросах, то срабатывает

  Ответить  
 
 автор: Slo_Nik   (02.06.2011 в 11:51)   письмо автору
 
   для: Lotanaen   (02.06.2011 в 11:49)
 

это если идентичны.

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 12:15)   письмо автору
 
   для: Slo_Nik   (02.06.2011 в 11:51)
 

а как вы это себе представляете? один столбец с несколькими наименованиями...

  Ответить  
 
 автор: Slo_Nik   (02.06.2011 в 14:26)   письмо автору
 
   для: Lotanaen   (02.06.2011 в 12:15)
 

Но даже если не делать псевдонимы столбцов, все имена будут такие как в первом запросе, а я ведь обращаюсь к разным таблицам и там разные названия столбцов.
вот этого пока не могу понять.

  Ответить  
 
 автор: Lotanaen   (02.06.2011 в 15:15)   письмо автору
 
   для: Slo_Nik   (02.06.2011 в 14:26)
 

одному и тому же столбцу два различных имени не присвоишь - какие при формировании таблицы присваиваются - те и остаются до окончания выполнения запроса...

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

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