#php #mysql #codeigniter #activerecord #relational-database
#php #mysql #codeigniter #activerecord #реляционная база данных
Вопрос:
У меня есть этот код, который извлекает некоторые данные из базы данных,
$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();
Я получаю некоторые странные результаты, ниже приведен снимок дампа результатов, который выглядит так, когда в таблице company_likes 0 записей и 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 запись в таблице company likes, я получаю следующее,
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', 'amp;pound;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:
Вы думали о том, чтобы разбить запрос на части? Вы могли бы создать временную таблицу, объединяющую часть вашего запроса, а затем завершить другую часть первоначального запроса вторым запросом!
Я не верю, что в классе active record есть что-либо для создания временной таблицы, поэтому вам нужно будет сделать это вручную.
Я также мог видеть, что запрос разбивается на более мелкие фрагменты и использует php для выполнения некоторых сравнений и подсчета для вас.
В противном случае могут оказаться полезными некоторые примеры данных и информация о создании таблицы, чтобы мы могли также попробовать выполнить запрос.
Комментарии:
1. Я просмотрел ваши данные и пришел к выводу, что ваша проблема в том, что существует шесть просмотров, где company_job_id = 1. Затем создается соответствующий результирующий набор для join в company_views при каждом запуске и увеличивается количество лайков, поскольку каждый раз есть совпадение для company_views.company_job_id =jobs.employer_id. Я бы сделал запрос меньшего размера и использовал php, чтобы получить нужное вам количество. Я не могу помочь вам с запросом самостоятельно, я хотел бы, чтобы это было сделано, но также не могу получить то, что вы ищете.