4

以下のSQL文では:

 SELECT `keywords`.keyID, count(`keywords-occurencies`.keyID) as countOccurencies 
                    FROM `keywords-occurencies`  
                    LEFT JOIN `keywords` 
                    ON `keywords-occurencies`.keyID = `keywords`.keyID 
                    WHERE `keywords-occurencies`.`keyID` IN (1,2,3) AND date BETWEEN '2013/01/25' AND '2013/01/27'
                    GROUP BY `keywords`.`keyID`

keyID 3 に戻り値がない場合は 0 としてカウントされず、結果セットに含まれず、このような結果が表示されます

keyID countOccurencies
1       3
3       5

次のようなゼロの結果を表示したい

keyID countOccurencies
1       3
2       0
3       5

テストするサンプルデータ:

--
-- Table structure for table `keywords`
--

CREATE TABLE IF NOT EXISTS `keywords` (
  `keyID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyName` varchar(40) NOT NULL,
  PRIMARY KEY (`keyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `keywords`
--

INSERT INTO `keywords` (`keyID`, `keyName`) VALUES
(1, 'testKey1'),
(2, 'testKey2');

-- --------------------------------------------------------

--
-- Table structure for table `keywords-occurencies`
--

CREATE TABLE IF NOT EXISTS `keywords-occurencies` (
  `occurencyID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyID` int(10) unsigned NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`occurencyID`),
  KEY `keyID` (`keyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `keywords-occurencies`
--

INSERT INTO `keywords-occurencies` (`occurencyID`, `keyID`, `date`) VALUES
(1, 1, '2013-01-27'),
(2, 1, '2013-01-26');

--
-- Constraints for table `keywords-occurencies`
--
ALTER TABLE `keywords-occurencies`
  ADD CONSTRAINT `keywords@002doccurencies_ibfk_1` FOREIGN KEY (`keyID`) REFERENCES `keywords` (`keyID`) ON DELETE CASCADE ON UPDATE CASCADE;
4

4 に答える 4

6

やる事

  • あなたはそれをグループ化する必要があります GROUP BY keywords-occurencies.keyID
  • keywords-occurencies.keyIDではなく、表示している必要がありますkeywords.keyID
  • カウントkeywords.keyID
  • (オプション) ALIAStableNames 以外のバッククォートを取り除くことができるように使用します

クエリ、

SELECT  a.keyID,
        count(b.keyID) AS countOccurencies
FROM    `keywords - occurencies` a
        LEFT JOIN `keywords` b
            ON a.keyID = b.keyID
WHERE   a.keyID IN ( 1, 2, 3 ) AND 
        DATE BETWEEN '2013/01/25' AND '2013/01/27'
GROUP   BY a.keyID

更新 1

サンプル レコードに基づいて、次の操作を行う必要があります。

  • tableNames を入れ替える
  • この条件をjoinDATE BETWEEN '2013-01-25' AND '2013-01-27'ON節に置きます。
  • (オプション) ALIAStableNames 以外のバッククォートを取り除くことができるように使用します

クエリ、

SELECT  a.keyID,
        count(b.keyID) AS countOccurencies
FROM    `keywords` a
        LEFT JOIN `keywords-occurencies` b
            ON a.keyID = b.keyID AND
               b.DATE BETWEEN '2013-01-25' AND '2013-01-27'
WHERE   a.keyID IN ( 1, 2, 3 ) 
GROUP   BY a.keyID
于 2013-01-27T16:00:25.187 に答える
2

date::にバックティックを付けます

SELECT 
`keywords`.keyID, 
count(`keywords-occurencies`.keyID) as countOccurencies 
FROM `keywords-occurencies`  
LEFT JOIN `keywords`  ON `keywords-occurencies`.keyID = `keywords`.keyID 
WHERE `keywords-occurencies`.`keyID` IN (1,2,3) AND `date` BETWEEN '2013/01/25' AND '2013/01/27'
GROUP BY `keywords-occurencies`.`keyID`
于 2013-01-27T15:57:58.173 に答える
1

2つのことがあります。左外部結合の最初の部分の ID でグループ化する必要があります。次に、 2 番目の面の 1 つを数える必要があります。右外部結合の場合、順序は逆になります。

SELECT k.keyID, count(ko.keyID) as countOccurencies 
FROM `keywords-occurencies` ko
      RIGHT JOIN `keywords` k
      ON ko.keyID = k.keyID 
WHERE k.`keyID` IN (1,2,3) AND date BETWEEN '2013/01/25' AND '2013/01/27'
GROUP BY k.`keyID`

この理由は、左外部結合に関係しています。一致がない場合でも、最初のテーブルにすべてが保持されます。したがって、ここで完全なリストを取得できます。カウントに関しては、一致をカウントしたい。最初のテーブルで id をカウントすると、常に少なくとも 1 になります。2 番目のテーブルで id をカウントすると、0 を取得できます。

クエリを読みやすくするために、テーブルにエイリアスも追加したことに注意してください。

于 2013-01-27T16:05:50.663 に答える
0

それを変更してLEFT JOIN私のために働いた:

SELECT k.keyID, count(ko.keyID) as countOccurencies 
FROM `keywords-occurencies` ko
      LEFT JOIN `keywords` k
      ON ko.keyID = k.keyID 
WHERE k.`keyID` IN (1,2,3) AND date BETWEEN '2013/01/25' AND '2013/01/27'
GROUP BY k.`keyID`
于 2015-05-19T07:38:31.753 に答える