Как выбрать из таблицы количество строк по двум пораметрам?

akxxiv

Новичок
Как выбрать из таблицы количество строк по двум пораметрам?

Я имею в виду вот что:
У меня есть две таблицы, одна из которой описывает структуру каталога, а другая перечень товаров.

Структура каталога (structure)

id - id раздела
name - название раздела

Перечень товаров (goods)

id - id товара
parent_id - id раздела товара
name - Наименование товара
type - Тип товара (спрос (0) или предложение(1))

Следует обратить внимание, что товары классифицируются по двум признакам - это по parent_id (по разделу) и по type (определяет продается ли этот товар или покупается)

Так вот как (желательно одним запросом) вывести перечень всех разделов, с указанием колличество товаров по типу (type)

т.е. должно получиться что-то типа того


Круглый лес
Спрос (345) | Предложение (214)

Пиломатериалы
Спрос (35) | Предложение (64)

И тд..

Как сделать без разделения по типу товара я знаю, а вот чтобы отдельно по спросу и предложению???

-~{}~ 30.01.06 18:39:

Не совсем туда добавил. Это в PHP и MySQL
 

bkonst

.. хочется странного?...
Например
Код:
SELECT
    s.name,
    SUM(g.type=0) AS buy,
    SUM(g.type=1) AS sell
  FROM structure s, goods g
  WHERE
    s.id = g.parent_id
  GROUP BY s.id
Набивалось непосредственно в форум, поэтому 100% работоспособность не гарантирую
 

bkonst

.. хочется странного?...
Ты что хотел сказать?
Нет, это не join. Если надо было бы выбрать и те категории, в которых нет товаров - нужен был бы join.
 

akxxiv

Новичок
Вообще-то да, нужно выбрать все категории в независимости от того есть в них товар или нет, просто если нет товара, то надо чтобы отображался 0.
 

vovik

Новичок
Автор оригинала: bkonst
Нет, это не join.
Ну почему же. Перечисление таблиц через запятую есть CROSS JOIN. Впрочем, в данном запросе он аналогичен INNER JOIN-у.

Чтобы выводились нули - примерно так.

PHP:
SELECT
    s.name,
    SUM(g.type=0) AS buy,
    SUM(g.type=1) AS sell
  FROM structure s
    LEFT JOIN goods g ON (g.parent_id = s.id)
  GROUP BY s.id
 

bkonst

.. хочется странного?...
Ну, собственно, и в чем проблема? Запрос будет выглядеть почти так же, за исключением того, что вместо WHERE будет LEFT JOIN .. ON s.id = g.parent_id. Соответственно, в type при этом будет null, и результат выполнения SUM - 0.

~~~

Немного не успел. Что касается JOIN - обычно под этим понимают всё-таки именно LEFT или RIGHT JOIN.
 

akxxiv

Новичок
Странно, но не счетает правильно.
buy почему-то = 0 в любом случае,
а sell не правильно счетает

-~{}~ 31.01.06 12:15:

Автор оригинала: vovik

Чтобы выводились нули - примерно так.

PHP:
SELECT
    s.name,
    SUM(g.type=0) AS buy,
    SUM(g.type=1) AS sell
  FROM structure s
    LEFT JOIN goods g ON (g.parent_id = s.id)
  GROUP BY s.id
В данном случае g.type может принемать значения 1 или 0, следовательно можно предположить, что SUM(g.type=0) ==0 (Что в итоге и получается, поле buy по всем разделам ==0), но вот что интересно SUM(g.type=1) так же неправильно счетает (точнее не так как хотелось бы). Почему-то если поле g.type==0, то в данном случае оно суммируется, если же нет (т.е. оно == 1) оно не суммируется. Не могу понять логигки. Как же все-таки мне сделать такой запрос?
 

vovik

Новичок
Я не супер силен в MySQL, могу ошибаться, но (g.type=0) == true, то есть сумма должна считать единицы.
 

bkonst

.. хочется странного?...
Па-а-а-нятия не имею. Может, поведение конструкции SUM(test=0) зависит от версии MySQL. Во всяком случае, на 4.1 следующее отрабатывает корректно:
CREATE DATABASE test;
USE test;
CREATE TABLE test (id INT PRIMARY KEY AUTO_INCREMENT, type TINYINT(1));
INSERT INTO test (type) VALUES (0);
INSERT INTO test (type) VALUES (0);
INSERT INTO test (type) VALUES (1);
INSERT INTO test (type) VALUES (1);
INSERT INTO test (type) VALUES (1);
INSERT INTO test (type) VALUES (1);
SELECT SUM(type=0), SUM(type=1) FROM test;
 

akxxiv

Новичок
Все разобрался. Не сразу догнал, что ENUM('0','1') отдает строковое значение. Привык что в РНР переменные автоматически преобразуется тип переменной. Сделал так

PHP:
SELECT 
	s.id as s_id, 
	s.name, 
	SUM(g.type="0") as demand,
	SUM(g.type="1") as supply
FROM 
	`trade_structure` s
LEFT JOIN
	`trading` g
ON
	g.parent_id = s.id
GROUP BY
	s.id
-~{}~ 31.01.06 12:36:

Всем спасибо!!!
 
Сверху