我正在为我复杂的SQL查询而苦苦挣扎,尽管我认为它并不是特别复杂。我接近正确的答案,但还没到那里。
我的数据库代表犯罪摘要。我的数据库中有三个表格(为了这个问题,我已经极大地简化了我的模式):逮捕,逮捕和处分。
每名被告可以多次逮捕(不包括被告表以简化)。每次逮捕都可以有多项指控,这些指控都在逮捕令中。并且每项指控都有一个等级并与处置相关(有罪,无罪等等)。这些倾向被分类为0 =某种形式的内疚倾向,1 =无罪倾向。
我想找到那些被判定被评定为" M1"在一个以上的案件。如果一个人被判定犯有超过M1的罪名,但他们处于同一案件中,那么该人不应该被遣返(除非他们有另一个案件有M1定罪)。
下面是一个sqlfiddle链接和用于创建和填充表的SQL。
我相信这个查询应该有效,但它并不是:
select a.defendantid, count(a.id) FROM `arrest` AS a LEFT JOIN `arrestcharges` AS ac ON a.id=ac.arrestid LEFT JOIN `dispositions` AS d ON ac.dispositionid=d.id WHERE d.dispocategory=0 AND ac.grade="M1" GROUP BY a.id HAVING COUNT(a.id) > 1 ORDER BY a.defendantid;
根据下面的sql,我预计被告人身份证1和5应该被退回,因为他们是唯一两名被告被判多次被捕的两名被告。但我得到的实际反应是2和5. 2不应该返回b / c被告2只在数据库中有一次逮捕。
对我做错了什么的想法?
CREATE TABLE IF NOT EXISTS `arrest` (
`id` int(6) unsigned NOT NULL,
`defendantid` int(6) unsigned NOT NULL,
`docketno` varchar(21) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `arrestcharges` (
`id` int(6) unsigned NOT NULL,
`arrestid` int(6) unsigned NOT NULL,
`grade` varchar(2) NOT NULL,
`dispositionid` int(6) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `dispositions` (
`id` int(6) unsigned NOT NULL,
`disposition` varchar(30) NOT NULL,
`dispoCategory` int(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `arrest` (`id`, `defendantid`, `docketno`) VALUES
('1', '1', 'MC-51-CR-0000222-1999'),
('2', '1', 'MC-51-CR-0000223-1999'),
('3', '1', 'MC-51-CR-0000224-1999'),
('4', '2', 'MC-51-CR-0002343-2000'),
('5', '3', 'MC-51-CR-0002349-2000'),
('6', '3', 'MC-51-CR-0002350-2000'),
('7', '3', 'MC-51-CR-0002351-2010'),
('8', '3', 'MC-51-CR-0002352-2013'),
('9', '4', 'MC-51-CR-1209293-2011'),
('10', '5', 'MC-51-CR-2389848-1999'),
('11', '5', 'MC-51-CR-3893923-1999'),
('12', '5', 'MC-51-CR-2393912-1999');
INSERT INTO `dispositions` (`id`, `disposition`, `dispoCategory`) VALUES
('1', 'Guilty', '0'),
('2', 'Not Guilty', '1'),
('3', 'Guilty Plea', '0'),
('4', 'Dismissed', '1');
INSERT INTO `arrestcharges` (`id`, `arrestid`, `grade`, `dispositionid`) VALUES
('1', '1', 'M1', '1'),
('2', '1', 'M', '2'),
('3', '2', 'F', '2'),
('4', '2', 'M1', '3'),
('5', '3', 'M1', '1'),
('6', '4', 'M2', '4'),
('7', '4', 'M1', '3'),
('8', '4', 'M1', '3'),
('9', '4', 'M1', '1'),
('10', '5', 'M1', '2'),
('11', '6', 'M1', '2'),
('12', '7', 'F2', '1'),
('13', '8', 'F3', '1'),
('14', '9', 'M1', '2'),
('15', '9', 'M1', '2'),
('16', '9', 'M1', '2'),
('17', '9', 'M1', '2'),
('18', '10', 'M1', '1'),
('19', '10', 'M1', '1'),
('20', '11', 'M2', '3'),
('21', '12', 'M1', '4'),
('22', '12', 'M1', '3');
答案 0 :(得分:1)
尝试此查询:
this.messageList.toArray().nativeElement.byId(messageId).getImageChild().setSrc('/another/img')
答案 1 :(得分:1)
您应该将不同的数字计算为所需行数distinct_count
,并使用having
过滤器,例如having distinct_count>1
。这样您就可以确保计数不会重复。
答案 2 :(得分:0)
您似乎是通过错误的列进行聚合。您需要a.defendantid
中的group by
:
SELECT a.defendantid, count(*)
FROM `arrest` a JOIN
`arrestcharges` ac
ON a.id = ac.arrestid JOIN
`dispositions` d
ON ac.dispositionid = d.id
WHERE d.dispocategory = 0 AND ac.grade = 'M1'
GROUP BY a.defendantid
HAVING COUNT(DISTINCT a.id) > 1
ORDER BY a.defendantid;
请注意,我还将外连接更改为内连接。如果收费和处置不可用,则无法满足您的过滤条件。因此,适当的join
是内部联接。