SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.06.2010 11:54:15

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Помогите с запросом к БД

Есть БД:
Схема БД "Компьютерная фирма" состоит из четырех таблиц:
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 такой оператор который может посчитать число строк удовлетворяющих определенному условию? И еще: как в результирующую таблицу занести это посчитаное число? заранее спасибо.

Неактивен

 

#2 18.06.2010 16:07:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

Сделайте через подзапросы?

SELECT maker, (SELECT COUNT(*) FROM PC WHERE PC.model = Product.model) AS pc, …
FROM Product;

Занести в таблицу — INSERT INTO tablename SELECT …; Столбцы целевой таблицы
должны совпадать, разумеется, по типу и количеству.

Неактивен

 

#3 30.06.2010 17:40:44

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

Вообщем сделал вот так:

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...) неправильный и во вложенных запросах нет группировки.

Как исправить ошибку? если честно не очень понял про группировку во вложенных запросах. помогите пожалуйста.

Неактивен

 

#4 30.06.2010 17:52:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

А какой смысл Вы хотите придать конатрукции SUM(SELECT COUNT(*))? Сумма из
одной строки всегда совпадает со значением этой строки.

Неактивен

 

#5 30.06.2010 17:58:58

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

Sum суммирует значения строк с одинаковым значение поля maker. разве не так?

Неактивен

 

#6 30.06.2010 18:16:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

Ммм, да, туплю, согласен smile
А что не работает?

Неактивен

 

#7 30.06.2010 18:40:52

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

дак все вроде работает. но мой препод говорит что вот этот синтаксис 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)

Неактивен

 

#8 30.06.2010 19:16:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

Неправильный синтаксис — это когда запрос не работает. Он хочет от Вас что-то иное.

Если бы таблица была одна, то правильный ответ известен:
SELECT maker, COUNT(*)
FROM Product LEFT JOIN PC USING (model)
GROUP BY maker;

К сожалению, с несколькими таблицами такая штука не прокатывает — COUNT(*) Вы
будете считать на произведении строк. Теоретически подойдет COUNT(DISTINCT pc.model),
но кто знает, что хочет преподаватель smile

Неактивен

 

#9 30.06.2010 19:27:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите с запросом к БД

Можно избавиться от SUM, но запрос будет сложнее

SELECT p1.maker,(SELECT count(*) FROM pc, product p2 WHERE pc.model=p2.model AND p2.maker=p1.maker) AS pc FROM (SELECT DISTINCT maker FROM product) p1;

Неактивен

 

#10 30.06.2010 19:37:46

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

А можно поподробнее про COUNT(DISTINCT pc.model)? как с ним можно сделать?

Неактивен

 

#11 30.06.2010 19:53:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

Написать вместо count(*), и наслаждаться результатом smile

Неактивен

 

#12 30.06.2010 20:23:13

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

paulus написал:

Написать вместо count(*), и наслаждаться результатом smile

не, это понятно, я про FROM Product LEFT JOIN PC USING(model) как там сделать когда таблиц несколько?

Отредактированно lebrosha (30.06.2010 20:23:39)

Неактивен

 

#13 30.06.2010 20:42:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом к БД

Неактивен

 

#14 30.06.2010 20:57:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом к БД

Нужно присоединить несколько раз:

LEFT JOIN PC ON PC.model = Product.model
LEFT JOIN laptop ON laptop.model = Product.model

Неактивен

 

#15 30.06.2010 21:48:43

lebrosha
Участник
Зарегистрирован: 13.05.2010
Сообщений: 13

Re: Помогите с запросом к БД

всем спасибо. вроде работает)

Неактивен

 

#16 18.02.2012 04:13:45

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

Здравствуйте,
У меня такая задача, которую никак не получается решить. Есть таблица списка коренных категорий вмести с дочерними категориями. А также есть таблица объявлений, которые связываются с таблицей категорий. Нужно чтобы мы смогли соединиться к 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>";
?>

Неактивен

 

#17 18.02.2012 04:36:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите с запросом к БД

Брр, давайте для начала отделим 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)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#18 18.02.2012 04:43:55

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

Спасибо, что ответили так быстро. Я попробую как вы написали, и результат опишу тут. Спасибо за поддержку и полезный совет.

Неактивен

 

#19 18.02.2012 04:50:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите с запросом к БД

Обращайтесь smile. Если что-то не получится, то приложите Ваши таблицы  (структуру и данные (можно не все, буквально несколько строк, чтоб пример рабочий можно было состряпать), примерно как здесь, то есть чтобы были инструкции на create table и нa insert) ну и непосредственно результат, который хотите получить.

Кстати, запрос составлен с учетом того, что у подкатегории не может быть своей подкатегории. Как у Вас с этим?

Отредактированно deadka (18.02.2012 04:53:56)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#20 18.02.2012 05:07:51

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

у подкатегории действительно нет подкатегории, а уже только объявления. Структура такова.

Авто -> легковые автомобили ->
                                             Объявление 1
                                             Объявление 2 и т.д

Авто -> грузовые ->
                                             Объявление 1
                                             Объявление 2 и т.д

На главной отображается список коренных категорий, например Авто (4). Кол-тво (4) берется от итогового кол-тва объявлений относящихся к коренной категории.

Спасибо вам. Если не получится, то отправлю вам таблицы.

Неактивен

 

#21 18.02.2012 12:59:45

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

deadka написал:

Обращайтесь smile. Если что-то не получится, то приложите Ваши таблицы  (структуру и данные (можно не все, буквально несколько строк, чтоб пример рабочий можно было состряпать), примерно как здесь, то есть чтобы были инструкции на create table и нa insert) ну и непосредственно результат, который хотите получить.

Кстати, запрос составлен с учетом того, что у подкатегории не может быть своей подкатегории. Как у Вас с этим?

Здравствуйте,
Я сегодня отправила файлы на вашу почту. Проверьте, пожалуйста. Спасибо.

Неактивен

 

#22 18.02.2012 16:42:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите с запросом к БД

Проверил, ответил.

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)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#23 19.02.2012 05:54:22

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

Здравствуйте, я сделала так:

$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)

и к остальным тоже выдается такое же сообщение

Может я допустила тут ошибку в запросе?

Неактивен

 

#24 19.02.2012 10:47:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом к БД

Неактивен

 

#25 20.02.2012 00:40:29

Sogdiana
Участник
Откуда: Таджкистан
Зарегистрирован: 18.02.2012
Сообщений: 7

Re: Помогите с запросом к БД

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.") ";
?>
Спасибо за помощь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson