Задавайте вопросы, мы ответим
Вы не зашли.
Есть БД:
Схема БД "Компьютерная фирма" состоит из четырех таблиц:
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)
Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер).
Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов.
В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price.
Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах).
В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price.
Нужно сделать запрос:
Для таблицы Product получить результирующий набор в виде таблицы со
столбцами maker, pc, laptop и printer, в которой для каждого
производителя требуется указать количество имеющихся в наличии (т.е.
находящихся в таблицах PC, Laptop и Printer) различных по номерам
моделей изделий соответствующего типа. Либо, если производитель такой тип продукции не производит, вернуть NULL в соответствующей ячейке.
Объсните мне пожалуйста как тут чего делать, а то владею sql только на уровне простой выборки данных . Есть в sql такой оператор который может посчитать число строк удовлетворяющих определенному условию? И еще: как в результирующую таблицу занести это посчитаное число? заранее спасибо.
Неактивен
Сделайте через подзапросы?
SELECT maker, (SELECT COUNT(*) FROM PC WHERE PC.model = Product.model) AS pc, …
FROM Product;
Занести в таблицу — INSERT INTO tablename SELECT …; Столбцы целевой таблицы
должны совпадать, разумеется, по типу и количеству.
Неактивен
Вообщем сделал вот так:
SELECT maker, sum((SELECT COUNT(*) FROM pc WHERE pc.model = product.model)) AS pc, sum((SELECT COUNT(*) FROM laptop WHERE laptop.model = product.model)) as laptop, sum((SELECT COUNT(*) FROM printer WHERE printer.model = product.model)) AS printer
FROM product
GROUP BY maker
Запрос работает, но мне сказали что синтаксис sum(select...) неправильный и во вложенных запросах нет группировки.
Как исправить ошибку? если честно не очень понял про группировку во вложенных запросах. помогите пожалуйста.
Неактивен
А какой смысл Вы хотите придать конатрукции SUM(SELECT COUNT(*))? Сумма из
одной строки всегда совпадает со значением этой строки.
Неактивен
Sum суммирует значения строк с одинаковым значение поля maker. разве не так?
Неактивен
Ммм, да, туплю, согласен
А что не работает?
Неактивен
дак все вроде работает. но мой препод говорит что вот этот синтаксис sum(select...) как бы неправильный, и про группировку еще вложенных запросов говорит, вообщем не принимает задание.
если вот я GROUP BY maker в каждом подзапросе делаю и SUM убираю то в результирующей таблице получается много полей с одинаковыми производителями.
maker pc laptop printer
Acer 1 0 NULL
Asus NULL 1 NULL
Asus 1 0 NULL
Epson NULL 0 1
Epson NULL 0 1
HP NULL 0 1
MSI 1 0 NULL
Мне их как-бы сложить надо.
Отредактированно lebrosha (30.06.2010 18:43:13)
Неактивен
Неправильный синтаксис — это когда запрос не работает. Он хочет от Вас что-то иное.
Если бы таблица была одна, то правильный ответ известен:
SELECT maker, COUNT(*)
FROM Product LEFT JOIN PC USING (model)
GROUP BY maker;
К сожалению, с несколькими таблицами такая штука не прокатывает — COUNT(*) Вы
будете считать на произведении строк. Теоретически подойдет COUNT(DISTINCT pc.model),
но кто знает, что хочет преподаватель
Неактивен
Можно избавиться от SUM, но запрос будет сложнее
Неактивен
А можно поподробнее про COUNT(DISTINCT pc.model)? как с ним можно сделать?
Неактивен
Написать вместо count(*), и наслаждаться результатом
Неактивен
paulus написал:
Написать вместо count(*), и наслаждаться результатом
не, это понятно, я про FROM Product LEFT JOIN PC USING(model) как там сделать когда таблиц несколько?
Отредактированно lebrosha (30.06.2010 20:23:39)
Неактивен
Неактивен
Нужно присоединить несколько раз:
LEFT JOIN PC ON PC.model = Product.model
LEFT JOIN laptop ON laptop.model = Product.model
…
Неактивен
всем спасибо. вроде работает)
Неактивен
Здравствуйте,
У меня такая задача, которую никак не получается решить. Есть таблица списка коренных категорий вмести с дочерними категориями. А также есть таблица объявлений, которые связываются с таблицей категорий. Нужно чтобы мы смогли соединиться к 2 таблицам и подсчитать объявления, которые относятся и коренным и дочерним категориям и вывести количество (например, авто(49). В авто имеются скажем 3 подкатегорий, в которых хранятся объявления, а в самом коренном категории авто нет объявлений, а только подкатегории, в которых хранятся объявления. Необходимо, чтобы мы смогли подсчитать сколько объявлений в дочерних категориях и вывести их количество рядом с коренной категорией). Ниже приведен код, в котором никак не могу добиться ожидаемого результата. Прошу вас помочь с решением данного вопроса. Заранее спасибо.
<?
$GLOBALS['cccount'] = 0;
if (defined('JBCITY')) $GLOBALS['subQuery'] = ' AND city_id = '.JBCITY; else $GLOBALS['subQuery'] = '';
function listcat2($id,$sub){
$categories = mysql_query("SELECT id, child_category, name_cat, en_name_cat FROM jb_board_cat WHERE root_category = $id ORDER by sort_index"); cq();
while($category = mysql_fetch_assoc($categories)){
$name_cat = (defined('JBLANG') && constant('JBLANG')=='en') ? $category['en_name_cat'] : $category['name_cat'];
$count_ads = mysql_result(mysql_query("SELECT COUNT(id) from jb_board WHERE id_category='".$category['id']."' AND old_mess='old'".$GLOBALS['subQuery']), 0);cq();
//if($sub=="2") $subclass="class=\"subclass\"";else $subclass="";
echo "(".$count_ads++.")";
$GLOBALS['cccount'] = $GLOBALS['cccount'] + $count_ads;
if($category['child_category']==1){listcat2($category['id'],$sub+1);}
}
}
$categories = mysql_query("SELECT id, root_category, child_category, name_cat,en_name_cat,img FROM jb_board_cat WHERE root_category=0 ORDER by sort_index"); cq();
$num_rows = @mysql_num_rows($categories);
$count_field=round($num_rows/2);$td=0;
echo "<div style=\"float:left;width:50%;\" class=\"index_cat gray sm\">";
while($category = @mysql_fetch_assoc($categories)){
$name_cat = (defined('JBLANG') && constant('JBLANG')=='en') ? $category['en_name_cat'] : $category['name_cat'];
echo (@$category['img'])?"<img alt=\"".$name_cat."\" class=\"rootcatimg\" src=\"".$u."cat/".$category['img']."\" />":"";
echo "<a class=\"rootcat\" href=\"c".$category['id'].".html\">".$name_cat." </a> ";
listcat2($category['id'],1);
echo "<br /><br />";
$td++;if($td>=$count_field){echo "</div><div style=\"float:right;width:50%;\" class=\"index_cat gray sm\">";$td=0;}
}
echo "</div><div class=\"clear\"></div>";
?>
Неактивен
Брр, давайте для начала отделим sql от php.
Допустим, у нас есть таблица категорий cat, в которой будут основные поля - id, name, parent_id, где parent_id - id отцовской категории. В случае, если категория не является дочерней категорией (например авто), то у нее parent_id будет NULL.
И таблица объявлений - adv. Основные поля - id, cat_id (ссылка на категорию, где будет объявление), content (содержимое объявления).
Мы хотим получить количество объявлений в каждой "корневой" категории (включая объявления в ее дочерних котегориях), то есть в той, которая не является дочерней, например "авто".
Как это можно сделать:
SELECT `id`, `name`, (SELECT count(*) FROM `adv` WHERE (`cat_id` = `c`.`id`) OR (cat_id IN (SELECT id FROM cat WHERE parent_id = c.id) ) ) FROM `cat` `c` WHERE parent_id IS NULL ORDER BY `name` ASC;
Отредактированно deadka (18.02.2012 04:40:35)
Неактивен
Спасибо, что ответили так быстро. Я попробую как вы написали, и результат опишу тут. Спасибо за поддержку и полезный совет.
Неактивен
Обращайтесь . Если что-то не получится, то приложите Ваши таблицы (структуру и данные (можно не все, буквально несколько строк, чтоб пример рабочий можно было состряпать), примерно как здесь, то есть чтобы были инструкции на create table и нa insert) ну и непосредственно результат, который хотите получить.
Кстати, запрос составлен с учетом того, что у подкатегории не может быть своей подкатегории. Как у Вас с этим?
Отредактированно deadka (18.02.2012 04:53:56)
Неактивен
у подкатегории действительно нет подкатегории, а уже только объявления. Структура такова.
Авто -> легковые автомобили ->
Объявление 1
Объявление 2 и т.д
Авто -> грузовые ->
Объявление 1
Объявление 2 и т.д
На главной отображается список коренных категорий, например Авто (4). Кол-тво (4) берется от итогового кол-тва объявлений относящихся к коренной категории.
Спасибо вам. Если не получится, то отправлю вам таблицы.
Неактивен
deadka написал:
Обращайтесь . Если что-то не получится, то приложите Ваши таблицы (структуру и данные (можно не все, буквально несколько строк, чтоб пример рабочий можно было состряпать), примерно как здесь, то есть чтобы были инструкции на create table и нa insert) ну и непосредственно результат, который хотите получить.
Кстати, запрос составлен с учетом того, что у подкатегории не может быть своей подкатегории. Как у Вас с этим?
Здравствуйте,
Я сегодня отправила файлы на вашу почту. Проверьте, пожалуйста. Спасибо.
Неактивен
Проверил, ответил.
SELECT
`c`.`id`,
`c`.`name_cat`,
(SELECT count(*) FROM `jb_board` WHERE (`id_category` = `c`.`id`) OR (`id_category` IN (SELECT `id` FROM `jb_board_cat` WHERE `root_category` = `c`.`id`) ) ) AS count_
FROM
`jb_board_cat` AS `c`
WHERE
`c`.`root_category` = 0
ORDER BY
`name_cat` ASC;
Отредактированно deadka (19.02.2012 02:50:25)
Неактивен
Здравствуйте, я сделала так:
$primerr = mysql_query("SELECT
`c`.`id`,
`c`.`name_cat`,
(SELECT count(*) FROM `jb_board` WHERE (`id_category` = `c`.`id`) OR (`id_category` IN (SELECT `id` FROM `jb_board_cat` WHERE `root_category` = `c`.`id`) ) ) AS count_
FROM
`jb_board_cat` AS `c`
WHERE
`c`.`root_category` = 0
ORDER BY
`name_cat` ASC ");
echo "<a class=\"rootcat\" href=\"c".$category['id'].".html\">".$name_cat." </a>(".$primerr.") ";
В результате выдается такое сообщение
Юридические услуги и финансы (Resource id #13)
Обучение и репетиторство (Resource id #14)
и к остальным тоже выдается такое же сообщение
Может я допустила тут ошибку в запросе?
Неактивен
Неактивен
vasya написал:
http://sqlinfo.ru/forum/viewtopic.php?id=669
Здравствуйте,
Хотела сделать тоже самое как тут http://sqlinfo.ru/forum/viewtopic.php?id=669, но не смогла понять как это сделать это с
<?
$primerr = mysql_query("SELECT
`c`.`id`,
`c`.`name_cat`,
(SELECT count(*) FROM `jb_board` WHERE (`id_category` = `c`.`id`) OR (`id_category` IN (SELECT `id` FROM `jb_board_cat` WHERE `root_category` = `c`.`id`) ) ) AS count_
FROM
`jb_board_cat` AS `c`
WHERE
`c`.`root_category` = 0
ORDER BY
`name_cat` ASC ");
echo "<a class=\"rootcat\" href=\"c".$category['id'].".html\">".$name_cat." </a>(".$primerr.") ";
?>
Спасибо за помощь.
Неактивен