Dotaz pro počet položek v tabulce

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Dismember
Člen | 50
+
0
-

Zdravím,

prošel jsem si fórum pro řešení tohoto úkolu a napsal jsem podle toho dotaz. Jenže mi nějak nefunguje…

Mám tabulku ‚source‘ a ‚item‘. V tabulce ‚item‘ mám uloženy položky, přičemž každá má nějaké ‚source_id‘ pro označení zdroje té položky.

Má databáze:

<?php
DROP TABLE IF EXISTS `item`;
CREATE TABLE `item` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(300) NOT NULL,
  `file` varchar(200) NOT NULL,
  `filetype` varchar(10) NOT NULL,
  `author` varchar(30) NOT NULL,
  `created` datetime NOT NULL,
  `inserted` datetime NOT NULL,
  `lang` enum('cz','en','de','ru') NOT NULL DEFAULT 'cz',
  `source_id` int(10) unsigned NOT NULL,
  `topic_id` int(10) unsigned NOT NULL,
  `region_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_source` (`source_id`),
  KEY `fk_topic` (`topic_id`),
  KEY `fk_region` (`region_id`),
  CONSTRAINT `fk_region` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`),
  CONSTRAINT `fk_source` FOREIGN KEY (`source_id`) REFERENCES `source` (`id`),
  CONSTRAINT `fk_topic` FOREIGN KEY (`topic_id`) REFERENCES `topic` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `source`;
CREATE TABLE `source` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `sourcetype` enum('Vlastni','Prevzate','Placene','Casopisy') NOT NULL DEFAULT 'Vlastni',
  `note` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
?>

Chci zjistit počet položek u jednotlivých zdrojů.

Mám napsáno:

<?php
$this->database->table('source')->select('id, name, note')->select('COUNT(item.source_id) AS count')
->group('source_id');
?>

Laděnka hlásí No reference found for $source->item

Pomůžete mi někdo ten dotaz napsat správně? Díky"

Mysteria
Člen | 797
+
0
-

Znamená to, že v tabulce source nemáš cizí klíč odkazující na tabulku item. Ty to máš totiž opačně, takže potřebuješ buď backjoin (dvojtečka před :item.source_id):

$this->database->table('source')->select('source.id, name, note, COUNT(:item.source_id) count')->group('source_id')

nebo to přepsat takhle:

$this->database->table('item')->select('source.id, source.name, source.note, COUNT(item.source_id) count')->group('source_id')
Dismember
Člen | 50
+
0
-

Díky moc, už to teda chápu a příkaz fungoval :-)

Ještě mám jeden problém. Ono to tahá jen zdroje, které mají alespoň jeden záznam. Jak zajistím, aby mi vytáhnul všechny a u některých byla prostě nula?