Witam,

mam taki małe zapytanie SQL. Możę powiem odrazu co ono robi

1.Listuję liste dokumentów
2.Kazdy ma pole UserId -> łączymy sie z tabelą user i wydobywamy wszystko dane z tej tabeli dla danego usera
3.Każdy dokument ma swoje Id i terach chce sie polaczyc z tabela documents_con i policzyc ile innych dokumentów jest przypisanych do danego i zapisac do do kolumny np countDocCon ( ... As countDocCon ).

ja mam takie coś ale wyswetla mi nie tak jak bym ( wszedzie 0 nie liczy )

  1. SELECT * , count( ifnull( documents_con.DocId, 0 ) ) -1 AS value2
  2. FROM `documents` LEFT JOIN `documents_con` ON `documents_con`.`DocId` = `documents`.`Id`
  3. RIGHT JOIN `user` ON `user`.`user_id` = `documents`.`UserId`
  4. WHERE (
  5. documents.Cat = 'HydePark_'
  6. ) AND (
  7. Act = 'Y'
  8. ) AND (
  9. `documents`.`Lang` = 'Polski'
  10. )
  11. GROUP BY documents.Id
  12. LIMIT 0, 30


struktura

3 tabel nizej


Kod
CREATE TABLE `documents` (
  `Id` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Lang` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Title` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Desc` text collate utf8_polish_ci NOT NULL,
  `CreateDate` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Password` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Cat` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Time` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Act` enum('Y','N') collate utf8_polish_ci NOT NULL default 'Y',
  `UserId` varchar(255) collate utf8_polish_ci NOT NULL,
  KEY `Id` (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

CREATE TABLE `documents_con` (
  `Id` varchar(225) collate utf8_polish_ci NOT NULL default '',
  `DocId` varchar(225) collate utf8_polish_ci NOT NULL default '',
  `DocIdCon` varchar(225) collate utf8_polish_ci NOT NULL default '',
  `Time` varchar(225) collate utf8_polish_ci NOT NULL default '',
  `Lang` varchar(200) collate utf8_polish_ci NOT NULL default '',
  PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


CREATE TABLE `user` (
  `user_id` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `login` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `password` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `Email` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `UserType` enum('Private','Company') collate utf8_polish_ci NOT NULL default 'Private',
  `CompanyName` varchar(255) collate utf8_polish_ci default NULL,
  `NIP` varchar(255) collate utf8_polish_ci default NULL,
  `ContactPerson` varchar(255) collate utf8_polish_ci default NULL,
  `Fname` varchar(255) collate utf8_polish_ci default NULL,
  `Mname` varchar(255) collate utf8_polish_ci default NULL,
  `Lname` varchar(255) collate utf8_polish_ci default NULL,
  `BirthYear` varchar(255) collate utf8_polish_ci default NULL,
  `Street` varchar(255) collate utf8_polish_ci default NULL,
  `PostCode` varchar(255) collate utf8_polish_ci default NULL,
  `City` varchar(255) collate utf8_polish_ci default NULL,
  `Country` varchar(255) collate utf8_polish_ci default NULL,
  `PhoneNumber` varchar(255) collate utf8_polish_ci default NULL,
  `Lang` varchar(255) collate utf8_polish_ci NOT NULL default 'pl',
  `Active` enum('Y','N') collate utf8_polish_ci NOT NULL default 'N',
  `CreateDate` varchar(255) collate utf8_polish_ci NOT NULL default '0000-00-00 00:00:00',
  `Blocked` enum('N','Y') collate utf8_polish_ci NOT NULL default 'N',
  `Group` varchar(255) collate utf8_polish_ci NOT NULL default '',
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;



cos takiego działa tyko ze teraz nie pobiera Id dokumentu

  1. SELECT *, ifnull(count(documents_con.Id),0) AS CountDocCon
  2. FROM `documents` LEFT JOIN `documents_con` ON `documents_con`.`DocIdCon`=`documents`.`Id`
  3. LEFT JOIN `user` ON `user`.`user_id`=`documents`.`UserId`
  4. WHERE ( documents.Cat = 'HydePark_' ) AND ( documents.Lang = 'Polski' )
  5. GROUP BY Title


moze ktos wie co i jak?

---
EDIT rozwiązane.

dla zainteresowanych

  1. <?php
  2. public function lstDocuments($_activ='',$_limit='')
  3. {
  4. $db = parent::Connect();
  5. $pis = DB_DataObject::factory('user');
  6. $pis2 = DB_DataObject::factory('documents_con');
  7.  
  8. $db->query("set names 'utf8'");
  9. if ($this->_where <> '') {
  10. $db->whereAdd("documents.Cat = '$this->_where'");
  11. }
  12. if ($this->_lang <> '') {
  13. $db->whereAdd("documents.Lang = '$this->_lang'");
  14. }else{
  15. $db->Lang = Lang::getDisLang();
  16. }
  17.  
  18. if ($this->_f != '' or $this->_t !='')
  19. {
  20. $db->limit($this->_f,$this->_t);
  21. }
  22.  
  23. if ($this->_order <> '') {
  24. $db->Orderby("documents.".$this->_order);
  25. }
  26. if ($_activ <> '') {
  27. $db->whereAdd("documents.Act = 'Y'");
  28. }
  29. $db->selectAdd('documents.Id as Id');
  30. $db->joinAdd($pis2,"LEFT");
  31. $db->joinAdd($pis,"LEFT");
  32. $db->selectAdd('ifnull(count(documents_con.Id),0) as CountDocCon');
  33. $db->groupBy(Title);
  34. $db->find();
  35. while($db->fetch()) {
  36. $result['data'][] = $db->toArray();
  37. }
  38. return $result = isset($result) ? $result : null;
  39. }
  40. ?>