SQL выборка

irkprin

Новичок
Есть 2 таблицы: Catalog и Proizvoditeli



На рисунке я привел пример содержания этих таблиц.

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

PHP:
<?=$row['proizvoditel']?>-<?=$row['alias']?>-<?=$row['collection']?>
Проблема заключается в том, что выводить строчку нужно только тогда, когда количество коллекций больше одной у отдельно взятого производителя.

Что у меня получилось наковырять:
1.
PHP:
$query = "
SELECT DISTINCT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp
FROM catalog AS c, proizvoditeli AS p
WHERE statusc ='on' AND p.idp = c.proizvoditel ";
получаю список строк вида:

40-alloc-domestic
40-alloc-commercial
44-domo-grass-dlya-golfa

2.
PHP:
$query = "
SELECT  proizvoditel, statusc, collection, COUNT(DISTINCT collection) 
FROM catalog 
WHERE statusc ='on' 
GROUP by proizvoditel";

PHP:
if($row[$m][3]>1) { здесь получу коллекции, которые мне как раз и нужны}

Уважаемые Гуру, как это объединить в один запрос?

P.S. позиций в табличках будут десятки тысяч
 

WMix

герр M:)ller
Партнер клуба
идея приблизительно такая
PHP:
SELECT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp, 
FROM catalog AS c
left join proizvoditeli AS p on p.idp = c.proizvoditel
WHERE statusc ='on' 
GROUP by proizvoditel

HAVING  COUNT(collection) > 1
 

irkprin

Новичок
PHP:
GROUP by proizvoditel
к сожалению такая группировка 100% убивает возможность получить 2 разные коллекции одного производителя.

40-alloc-domestic
40-alloc-commercial
 

WMix

герр M:)ller
Партнер клуба
PHP:
SELECT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp
FROM proizvoditeli AS p 
left join catalog AS c on p.idp = c.proizvoditel
WHERE p.idp IN (

  SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(*) > 1

)
 

irkprin

Новичок
PHP:
SELECT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp
FROM proizvoditeli AS p 
left join catalog AS c on p.idp = c.proizvoditel
WHERE p.idp IN (

  SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(*) > 1

)
Так вываливается все

и дубли
40-alloc-domestic
40-alloc-domestic
40-alloc-domestic

и производители с одной коллекцией
44-domo-grass-dlya-golfa
 

WMix

герр M:)ller
Партнер клуба
где у тебя дубликаты?
скинь хоть структуры табличек да данные чтоль

PHP:
SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(*) > 1
остались только proizvoditel с записью больше одного откуда берутся записи меньше двух?
 

irkprin

Новичок
где у тебя дубликаты?
скинь хоть структуры табличек да данные чтоль

PHP:
SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(*) > 1
остались только proizvoditel с записью больше одного откуда берутся записи меньше двух?
CREATE TABLE IF NOT EXISTS `catalog` (
`cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`statusc` varchar(10) NOT NULL DEFAULT 'off',
`alias` varchar(150) NOT NULL,
`collection` varchar(150) DEFAULT NULL,

PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=56 ;

--
-- Dumping data for table `catalog`
--

INSERT INTO `catalog` (`cat_id`, `statusc`, `alias`, `collection`, `proizvoditel`) VALUES

(10, 'on', 'dub-rustik', 'Domestic', '40'),
(11, 'on', 'dub-rustik1', 'Commercial', '40'),
(12, 'on', 'dub-rustik2', 'Original', '40'),
(13, 'on', 'dub-rustik3', 'Domestic', '40'),
(14, 'on', 'dub-rustik4', 'Home', '40'),
(15, 'on', 'dub-rustik5', '', '41'),
(16, 'on', 'trava', 'dlya-futbola', '42');



DROP TABLE IF EXISTS `proizvoditeli`;
CREATE TABLE IF NOT EXISTS `proizvoditeli` (
`idp` int(11) unsigned NOT NULL AUTO_INCREMENT,
`alias` varchar(100) NOT NULL,
PRIMARY KEY (`idp`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=201 ;

--
-- Dumping data for table `proizvoditeli`
--

INSERT INTO `proizvoditeli` (`idp`, `alias`) VALUES
(40, 'alloc'),
(41, 'golvabia'),
(42, 'domo-grass');
 

irkprin

Новичок
Смотри, в табличке Catalog идет список товаров, поэтому в каждой коллекции много товаров может быть они то и создают дубликаты я юзал DISTINCT в первом посте видно.
 

WMix

герр M:)ller
Партнер клуба
CREATE TABLE IF NOT EXISTS `catalog` (
`cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`statusc` varchar(10) NOT NULL DEFAULT 'off',
`alias` varchar(150) NOT NULL,
`collection` varchar(150) DEFAULT NULL,

PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=56 ;

INSERT INTO `catalog` (`cat_id`, `statusc`, `alias`, `collection`, `proizvoditel`) VALUES ...
кажись ты в таблице `catalog` забыл `proizvoditel` добавить,

PHP:
SELECT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp
FROM proizvoditeli AS p 
left join catalog AS c on p.idp = c.proizvoditel
WHERE p.idp IN (

  SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(*) > 1

)
Код:
+--------------+---------+------------+-------+-----+
| proizvoditel | statusc | collection | alias | idp |
+--------------+---------+------------+-------+-----+
|           40 | on      | Domestic   | alloc |  40 |
|           40 | on      | Commercial | alloc |  40 |
|           40 | on      | Original   | alloc |  40 |
|           40 | on      | Domestic   | alloc |  40 |
|           40 | on      | Home       | alloc |  40 |
+--------------+---------+------------+-------+-----+
5 rows in set (0.00 sec)
что лишнее чего не хватает?
 

WMix

герр M:)ller
Партнер клуба
Код:
mysql> SELECT *
    -> FROM `catalog`
    -> WHERE `collection` LIKE 'Domestic';
+--------+---------+-------------+------------+--------------+
| cat_id | statusc | alias       | collection | proizvoditel |
+--------+---------+-------------+------------+--------------+
|     10 | on      | dub-rustik  | Domestic   |           40 |
|     13 | on      | dub-rustik3 | Domestic   |           40 |
+--------+---------+-------------+------------+--------------+
2 rows in set (0.00 sec)
у тебя 2 записи!

ну а вообщем DISTINCT тебя спасет....
 

irkprin

Новичок
Спасибо тебе ОГРОМНОЕ!

вот так работает:

PHP:
SELECT DISTINCT c.proizvoditel, c.statusc, c.collection, p.alias, p.idp
FROM proizvoditeli AS p 
left join catalog AS c on p.idp = c.proizvoditel
WHERE p.idp IN (

  SELECT proizvoditel
  FROM catalog 
  WHERE statusc ='on' 
  GROUP by proizvoditel
  HAVING  COUNT(DISTINCT collection) > 1
 

irkprin

Новичок
я догадывался что двойной SELECT нужен, но сам такого никогда не писал
 

WMix

герр M:)ller
Партнер клуба
главное понимать что написанно, те. не задачу решить а задачи научиться решать!
 

irkprin

Новичок
Согласен, пытаюсь...
я вот про HAVING не знал, теперь прочел зачем и как его применяют
 
Сверху