2011-05-19 94 views
0

我有这样的代码是从数据库中拿出一些数据,MySQL的 - 笨活动记录帮助

$this->db->select('job_id, jobs.employer_id, COUNT(company_job_id) AS views, COUNT(like_job_id) AS likes, logo, company_name') 
     ->from('jobs') 
     ->join('company_likes', 'company_likes.like_job_id = jobs.employer_id', 'left') 
     ->join('company_views', 'company_views.company_job_id = jobs.employer_id', 'left') 
     ->join('employers', 'employers.employer_id = jobs.employer_id', 'left') 
     ->group_by('company_views.company_job_id'); 

     $query = $this->db->get(); 

     return $query->result_array(); 

我收到一些奇怪的结果,下面是拍摄结果的转储看起来当有0喜欢在company_likes表中的记录和6条在公司的意见表,

Array 
(
    [0] => Array 
     (
      [job_id] => 1 
      [employer_id] => 1 
      [views] => 6 
      [likes] => 0 
      [logo] => 11d4df5e2f7db152cd9bcc3782dd03b0.jpg 
      [company_name] => Test Company 
     ) 

) 

但是如果我有6条在company_views表,并在该公司1个记录表喜欢我得到以下,

Array 
(
    [0] => Array 
     (
      [job_id] => 1 
      [employer_id] => 1 
      [views] => 6 
      [likes] => 6 
      [logo] => 11d4df5e2f7db152cd9bcc3782dd03b0.jpg 
      [company_name] => Test Company 
     ) 

) 

这是因为如果意见和喜好越来越乘什么的,我怎么能做出这样我得到的是什么样的是数据库中真实再现?

这里是有问题的数据和表格的出口,

-- 
-- Table structure for table `company_likes` 
-- 

CREATE TABLE IF NOT EXISTS `company_likes` (
    `like_id` int(10) NOT NULL AUTO_INCREMENT, 
    `like_job_id` int(11) NOT NULL, 
    PRIMARY KEY (`like_id`), 
    KEY `fk_company_likes_jobs1` (`like_job_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

-- 
-- Dumping data for table `company_likes` 
-- 

INSERT INTO `company_likes` (`like_id`, `like_job_id`) VALUES 
(1, 1); 

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

-- 
-- Table structure for table `company_views` 
-- 

CREATE TABLE IF NOT EXISTS `company_views` (
    `view_id` int(10) NOT NULL AUTO_INCREMENT, 
    `company_job_id` int(11) NOT NULL, 
    PRIMARY KEY (`view_id`), 
    KEY `fk_company_views_jobs1` (`company_job_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

-- 
-- Dumping data for table `company_views` 
-- 

INSERT INTO `company_views` (`view_id`, `company_job_id`) VALUES 
(1, 1), 
(2, 1), 
(3, 1), 
(4, 1), 
(5, 1), 
(6, 1); 

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

-- 
-- Table structure for table `employers` 
-- 

CREATE TABLE IF NOT EXISTS `employers` (
    `employer_id` int(11) NOT NULL AUTO_INCREMENT, 
    `company_name` varchar(80) NOT NULL, 
    `company_summary` text NOT NULL, 
    `logo` varchar(60) NOT NULL, 
    `alternative_ads` varchar(100) DEFAULT NULL, 
    `facebook_url` varchar(100) DEFAULT NULL, 
    `twitter_url` varchar(100) DEFAULT NULL, 
    `user_id` int(10) NOT NULL, 
    PRIMARY KEY (`employer_id`), 
    KEY `fk_employers_users` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `employers` 
-- 

INSERT INTO `employers` (`employer_id`, `company_name`, `company_summary`, `logo`, `alternative_ads`, `facebook_url`, `twitter_url`, `user_id`) VALUES 
(1, 'Test Company', 'Test company is excatly what it says it is a test company, we have created this test company so that we can see that moovjob is functioning as it should be and that everything is upload, saving, applying and generally saving as we would expect.', '11d4df5e2f7db152cd9bcc3782dd03b0.jpg', 'http://www.simonainley.info/alternative', 'http://www.facebook.com/simon.ainley', 'http://www.twitter.com/simonainley', 2), 
(2, 'Test Company', 'Test company summary', '006474cf842654eb28deebec7e4dcbb9.png', 'http://www.simonainley.info/alternative', 'http://www.facebook.com/simon.ainley', 'http://www.twitter.com/simonainley', 5); 

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

-- 
-- Table structure for table `jobs` 
-- 

CREATE TABLE IF NOT EXISTS `jobs` (
    `job_id` int(11) NOT NULL AUTO_INCREMENT, 
    `job_title` varchar(80) NOT NULL, 
    `sectors` varchar(255) NOT NULL, 
    `salary` varchar(20) NOT NULL, 
    `retrain` enum('yes','no') NOT NULL, 
    `bonuses_available` enum('yes','no') NOT NULL, 
    `bonus_description` text, 
    `job_summary` text NOT NULL, 
    `job_description` text NOT NULL, 
    `employer_id` int(11) NOT NULL, 
    PRIMARY KEY (`job_id`), 
    KEY `fk_jobs_employers1` (`employer_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

-- 
-- Dumping data for table `jobs` 
-- 

INSERT INTO `jobs` (`job_id`, `job_title`, `sectors`, `salary`, `retrain`, `bonuses_available`, `bonus_description`, `job_summary`, `job_description`, `employer_id`) VALUES 
(1, 'Test Jobtitle', 'Sector 1', '£25,000', 'no', 'yes', 'Bonus Description', 'Job Summary', 'Job Description', 1); 

-- 
-- Constraints for dumped tables 
-- 

-- 
-- Constraints for table `company_views` 
-- 
ALTER TABLE `company_views` 
    ADD CONSTRAINT `company_views_ibfk_1` FOREIGN KEY (`company_job_id`) REFERENCES `jobs` (`employer_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

-- 
-- Constraints for table `employers` 
-- 
ALTER TABLE `employers` 
    ADD CONSTRAINT `fk_employers_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

-- 
-- Constraints for table `jobs` 
-- 
ALTER TABLE `jobs` 
    ADD CONSTRAINT `fk_jobs_employers1` FOREIGN KEY (`employer_id`) REFERENCES `employers` (`employer_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

回答

1

你有没有想过打破查询下来的?您可以创建一个包含部分查询的临时表,然后用第二个查询完成初始查询的另一部分!

我不相信活跃的记录类有任何东西来创建临时表,所以你需要手动做。

我也可以看到查询被分解成小块,并使用PHP做一些比较,并为您计算。

否则,一些示例数据和表创建信息可能很有用,所以我们也可以尝试查询。

+1

我翻遍了你的数据,得出结论,你的问题是有六个视图,其中company_job_id = 1。然后,每次运行时在company_views上创建一个匹配结果集,然后增加类似的数量每次匹配company_views.company_job_id = jobs.employer_id。我会做一个较小的查询,并使用PHP来达到你想要的正确数量。我自己无法帮助您处理查询,我希望看到它完成,但无法获得您要查找的内容。 – grantk 2011-05-19 13:56:05