[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP+MySQL
Kumirska
Привет Всем! разбираю свои ошибки в скриптах,кучу похожих запросов решил объединить в один. У меня было три таблицы: works-таблица с работниками, heads - таблица с начальниками отделов, director - таблица с директорами. На сайте(локальном) доступ к различным скриптам был по привелегии,то есть я в начале каждого скрипта проверял поочереди все три таблицы, то есть вытаскивал сначала из таблицы диреткоров логин равный сессии,созданной при входе на сайт,если не находил в директорах то искал в начальниках и тп,тем самым было 3 запроса к базе тока для проверки. Я объединил все три таблицы добавив поле rang, теперь запрос 1,а уже по рангу будет идти проверка привелегий. на сайте была статистика: отделов стока-то,директоров стока-то,начальников отделов стока-то,работников стока-то. Это тоже осуществлялось кучей запросов к разным таблицам. Вот На примере данной статистики хочу понять логику сложного запроса.(простите за поэму,хотел подробнее объяснить)


$result10 = mysql_query("SELECT COUNT(*) FROM otdel", $db);
$sum = mysql_fetch_assoc($result10); //количество отделов

$result11 = mysql_query("SELECT COUNT(*) FROM works", $db);
$sum2 = mysql_fetch_assoc($result11); //количество рабочих

$count_h = mysql_query("SELECT COUNT(*) FROM heads", $db);
$sum_h = mysql_fetch_assoc($count_h); // количество начальников отделов

$count_d = mysql_query("SELECT COUNT(*) FROM director", $db);
$sum_d = mysql_fetch_assoc($count_d); // количество директоров

$sumsum = $sum_d[0]+$sum_h[0]+$sum2[0]; // общее количество людей в базе


Теперь же у меня только одна таблица works. Запрос я накидал как понял,селекты подозреваю не нужны в каждой строчке,но все же рискну и выложу что натворил:

 
$q_all = "SELECT COUNT(*) AS q_otdels FROM otdel;
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3;
SELECT COUNT (*) AS q_heads FROM works WHERE rang = 2;
SELECT COUNT (*) AS q_director FROM works WHERE rang = 1"
;
$quantity = mysql_query($q_all); //здесь не знаю как правильно сделать






Спустя 12 минут, 14 секунд (16.07.2011 - 08:45) borovik написал(а):
$q_all = "SELECT COUNT(*) AS q_otdels FROM otdel UNION
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT COUNT (*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT COUNT (*) AS q_director FROM works WHERE rang = 1"
;

Спустя 10 минут, 14 секунд (16.07.2011 - 08:56) Kumirska написал(а):
borovik

а что насчет запроса $quantity = mysql_query($q_all);
он верный?
и если я сделаю так

$quantity_all = mysql_fetch_assoc($quantity);
как я теперь могу вытащить первое значение по примеру
$sum_d[0]
теперь ведь у меня переменная будет $quantity_all['q_director']
а она кажется не вытащит уже количества диреткоров...

Спустя 11 минут, 12 секунд (16.07.2011 - 09:07) SoMeOnE написал(а):
Kumirska
   while ($quantity_all = mysql_fetch_assoc($quantity)) {
echo $quantity_all["q_director"];
}

Спустя 18 минут, 23 секунды (16.07.2011 - 09:25) Kumirska написал(а):
SoMeOnE мне не нужен вывод в цикле диреткоров,мне нужно их количество,то есть цифра

Спустя 15 минут, 16 секунд (16.07.2011 - 09:40) Sanchopansa написал(а):
ЧТо-то я не понял почему это переменная
$quantity_all['q_director'] 
не выведет количество директоров? В запросе ведь ясно все написано:
$q_all = "SELECT COUNT(*) AS q_otdels FROM otdel UNION
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT COUNT (*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT COUNT (*) AS q_director FROM works WHERE rang = 1"
;

Спустя 5 минут, 40 секунд (16.07.2011 - 09:46) SoMeOnE написал(а):
Kumirska
Что то я не очень понял, что тебе нужно.
Но если кол-во, то сначала запиши в массив директоров, а потом посчитай сколько в этом массиве элементов
$num_dir = count($quantity_all);

Спустя 15 минут, 54 секунды (16.07.2011 - 10:02) Kumirska написал(а):

$q_all = "
SELECT COUNT(*) AS q_otdels FROM otdel UNION
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT COUNT (*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT COUNT (*) AS q_director FROM works WHERE rang = 1"
;

$quantity_all = mysql_query($q_all);
$quantity = mysql_fetch_assoc($quantity_all);

$num = count($quantity['q_otdels']);

echo "Статистика: всего отделов - ".$num.";


Показывает 0,хотя отделов в базе данных 4

Или имеется ввиду циклом while добавлять в массив переменные,а потом посчитать его количество? я думал есть более прстой способ..

Спустя 7 минут, 19 секунд (16.07.2011 - 10:09) borovik написал(а):
$quantity_all = mysql_query($q_all) or die("fail");


   $num = $quantity['q_otdels'];

echo "Статистика: всего отделов - ".$num.";

Спустя 3 минуты, 4 секунды (16.07.2011 - 10:12) SoMeOnE написал(а):
Или же распечатай массив
print_r ($quantity);

Посмотри, что там происходит.
Я не пользуюсь этой ф-ей. не видел как она работает...

Спустя 7 минут, 37 секунд (16.07.2011 - 10:20) Kumirska написал(а):
$q_all = "SELECT COUNT(*) AS q_otdels FROM otdel UNION
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT COUNT (*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT COUNT (*) AS q_director FROM works WHERE rang = 1"
;
$quantity_all = mysql_query($q_all) or die(mysql_error());
$quantity = mysql_fetch_assoc($quantity_all);


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS q_heads FROM works WHERE rang = 2 UNION SELECT COUNT (*) AS q_director ' at line 3

Копать дальше пока смысла нет если проблема все равно в запросе

Отредактировал: ошибку исправил удалением пробелов перед скобками. Теперь можно и считать переменные

Спустя 2 минуты, 56 секунд (16.07.2011 - 10:23) borovik написал(а):
COUNT (*) пробелы не нужны

Спустя 22 минуты, 32 секунды (16.07.2011 - 10:45) Kumirska написал(а):
	 $q_all = "SELECT id FROM otdel UNION
SELECT COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT COUNT(*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT COUNT(*) AS q_director FROM works WHERE rang = 1"
;
$quantity_all = mysql_query($q_all) or die(mysql_error());
$quantity = mysql_fetch_assoc($quantity_all);


print_r ("massiv - ".$quantity['q_workers']);
echo "<br>massiv2 - ".count($quantity['q_workers']);
print_r ("<br>massiv3 - ".$quantity);


Вывод на экране пугающий:

Notice: Undefined index: q_workers in C:\apache\localhost\www\mark\departments.php on line 88
massiv -
Notice: Undefined index: q_workers in C:\apache\localhost\www\mark\departments.php on line 89

massiv2 - 0
massiv3 - Array
Notice: Undefined variable: num in C:\apache\localhost\www\mark\departments.php on line 94

Notice: Undefined index: q_heads in C:\apache\localhost\www\mark\departments.php on line 94

Notice: Undefined index: q_workers in C:\apache\localhost\www\mark\departments.php on line 94


я так понял что массив это переменная $quantity, а $quantity['q_otdels'] это уже строка со значениями ведь,откуда надо вытащить цифру,сам count. Вероятно я заблуждаюсь,но то что ничего не считает и не выдает на экран даже массив это факт

Методом проб...добавил еще

print_r ("<br>massiv4 - ".$quantity['q_workers']);
echo "<br>massiv5 - ".$quantity;


Сообщение:

massiv4 -
massiv5 - Array



Спустя 9 минут (16.07.2011 - 10:54) SoMeOnE написал(а):
Вот это неправильная запись
print_r ("<br>massiv3 - ".$quantity);


Если хочешь запись с объяснениями выведи так

print " \n massiv3 \n"; print_r($quantity); print " \n ";


Убери остальные выводы. Посмотри, что находиться в этом массиве.

Спустя 9 минут, 34 секунды (16.07.2011 - 11:04) Kumirska написал(а):
В этом и проблема, что
print " \n massiv3 \n"; print_r($quantity); print " \n ";


massiv3 Array ( [id] => 1 )

то есть из всего что я ему скармливал в запросах он мне выдал только id =>1

Спустя 40 минут, 29 секунд (16.07.2011 - 11:45) alex12060 написал(а):
это:


SELECT id FROM otdel UNION
SELECT
COUNT(*) AS q_workers FROM works WHERE rang = 3 UNION
SELECT
COUNT(*) AS q_heads FROM works WHERE rang = 2 UNION
SELECT
COUNT(*) AS q_director FROM works WHERE rang = 1


Пробуй изменить на это:


SELECT `id` FROM `otdel` UNION SELECT COUNT(*) AS `q_workers` FROM `works` WHERE `rang` IN (3, 2, 1);

Спустя 1 день, 18 часов, 44 минуты, 19 секунд (18.07.2011 - 06:29) Kumirska написал(а):
alex12060, запрос разве не все вместе посчитает? Так как мне нужно что-то вроде:
Статистика
Отделов:x, начальников отделов:y,сотрудников:z,Директоров: a.

Спустя 1 час, 32 минуты, 28 секунд (18.07.2011 - 08:01) Haotarez написал(а):
Глядя на ваш запрос он вам count и не вернет.

Для подсчета лучше как-то так попробовать
SELECT COUNT(*) AS `counts`, `rang` FROM `works` GROUP BY `rang`


Вернет несколько строк в 2 столбца 1 - количество, второй собственно rang

Спустя 22 часа, 32 минуты, 41 секунда (19.07.2011 - 06:34) Kumirska написал(а):
А может лучше сделать SELECT id к примеру,выбрать айди
сотрудников,начальников,директоров,отделов, а потом уже
функцией count() посчитать как-то


$q = "SELECT id FROM otdel UNION
SELECT id AS workers FROM works WHERE rang = 3 UNION
SELECT id AS heads FROM works WHERE rang = 2 UNION
SELECT id AS director FROM works WHERE rang = 1"
;

$quantity_all = mysql_query($q);

$quantity = mysql_fetch_assoc($quantity_all);



Только теперь получается что массив состоит из массивов,как посчитать фуннкцией count() айди отделов,сотрудников и тп отдельно?

Спустя 4 часа, 39 минут, 35 секунд (19.07.2011 - 11:14) Kumirska написал(а):
только вот думаю надо делать UNION ALL если я не ошибаюсь чтоб не исключались одноименные айди из массива

Спустя 3 часа, 58 минут, 42 секунды (19.07.2011 - 15:12) alexbel2404 написал(а):
count($quantity['director']) и т.д. ))

Спустя 35 минут, 20 секунд (19.07.2011 - 15:48) Sanchopansa написал(а):
блин.. народ.. проще было уже выполнить 3 отдельных запроса и не париться...
$sql1 = "SELECT COUNT(*) FROM works WHERE rang = 3";
$sql2 = "SELECT COUNT(*) FROM works WHERE rang = 2";
$sql3 = "SELECT COUNT(*) FROM works WHERE rang = 1";

Спустя 14 часов, 49 минут, 18 секунд (20.07.2011 - 06:37) Kumirska написал(а):
Sanchopansa, судя по всему так и придется сделать, вернее оставить как было :)
Но хочу разобраться с очень важной для меня сейчас темой, то есть комбинированный запрос типа:


$primer = "SELECT id,name,foto FROM people WHERE id > 5 UNION ALL
SELECT date,message FROM arhiv WHERE rang< 3"
;

$vajen = mysql_query($primer);



Так вот,получается в переменной $vajen имеется 2 вложенных массива, первый это с именами,фотками и айди людей, второй с сообщениями и датами их написания. Как реализовать полноценный выбор данных?? что в таких случаях делают? я поэтому и бился с этим запросом со счетчиками так долго, чтобы понять как это осуществляется

Спустя 16 дней, 4 часа, 11 минут, 25 секунд (6.08.2011 - 10:48) Kumirska написал(а):
Извиняюсь за назойливость,срочно нужно было =)


_____________
никому не дано знать абсолютной истины, ибо понятия, которыми мы оперируем, сами по себе относительны
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.