|
|
|
| Добрый вечер.
Есть таблица, где хранится информация по фирмам. Так же есть ещё три таблицы, где хранится информация по акциям, товарам и новостям для каждой фирмы.
Задача состоит в том, что если фирма блокируется для просмотра на сайте надо заблокировать акции, товары и новости для этой фирмы.
Пробовал обойти таблицы и получить информацию через 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] => товар для фирмы
)
|
Подскажите как правильно выполнить эту задачу?
Благодарю откликнувшихся. | |
|
|
|
|
|
|
|
для: Slo_Nik
(31.05.2011 в 20:04)
| | Сообщите какой результат вы ожидаете, что должен возвращать данный запрос? Уникальные товары? Если да, то добавьте в конце строку GROUP BY `goods`.`id_goods` | |
|
|
|
|
|
|
|
для: cheops
(31.05.2011 в 22:02)
| | должен вернуть акции, товары, новости, которые принадлежат данной фирме, для того, что бы заблокировать их к просмотру.
пробовал группировать по id_firm, что получаю в массивах уже написал, дублируются акции и товары, а надо что бы было - одна акция, один товар и две новости. если будет другое кол-во акций, новостей и товаров, то должно вернуть соответствующее кол-во каждого наименования.
получается, что надо последовательно проверить таблицы и если есть хотя бы одно наименование принадлежащее данной фирме, то заблокировать. | |
|
|
|
|
|
|
|
для: cheops
(31.05.2011 в 22:02)
| | так как же всё таки сделать обход таблиц одним запросом, и если значение поля не пустое, то выполнить обновление значения поля? | |
|
|
|
|
|
|
|
для: Slo_Nik
(01.06.2011 в 11:06)
| | а если с помощью UNION ? | |
|
|
|
|
|
|
|
для: 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. оригинальные названия индексов нужно для определения в какой таблице делать обновление записей | |
|
|
|
|
|
|
|
для: 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 определяйте таблицу | |
|
|
|
|
|
|
|
для: Lotanaen
(02.06.2011 в 09:56)
| | Такой вариант я пробовал, результат - "0" | |
|
|
|
|
|
|
|
для: 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."";
?>
|
| |
|
|
|
|
|
|
|
для: Lotanaen
(02.06.2011 в 10:39)
| | да, такой вариант дал положительный результат, спасибо )))
вот только не нашёл я в руководстве объяснение тому, почему для всех таблиц выставляются одинаковые имена полей? | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.06.2011 в 11:13)
| | так вы же объединяете запросы - как вам таблицу то выводить с разными полями? | |
|
|
|
|
|
|
|
для: Lotanaen
(02.06.2011 в 11:24)
| | Действительно, не подумал, но а псевдонимы столбцов, ведь не срабатывает? | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.06.2011 в 11:33)
| | если псевдонимы идентичны во всех объединенных запросах, то срабатывает | |
|
|
|
|
|
|
|
для: Lotanaen
(02.06.2011 в 11:49)
| | это если идентичны. | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.06.2011 в 11:51)
| | а как вы это себе представляете? один столбец с несколькими наименованиями... | |
|
|
|
|
|
|
|
для: Lotanaen
(02.06.2011 в 12:15)
| | Но даже если не делать псевдонимы столбцов, все имена будут такие как в первом запросе, а я ведь обращаюсь к разным таблицам и там разные названия столбцов.
вот этого пока не могу понять. | |
|
|
|
|
|
|
|
для: Slo_Nik
(02.06.2011 в 14:26)
| | одному и тому же столбцу два различных имени не присвоишь - какие при формировании таблицы присваиваются - те и остаются до окончания выполнения запроса... | |
|
|
|