繁体   English   中英

从另一个表中选择计数仅显示其存在的一行

[英]Selecting count from another table is only showing 1 row where it exists

我试图从另一个表中选择行计数,即使它为空,所以即使它为空,它也只显示数字0,但仍选择主表的行。

这是我的sql:

SELECT training.*, 
    count(distinct training_transactions.training_transaction_course) as completed_training_payments 
    FROM training
    INNER JOIN training_transactions
         ON training.course_id = training_transactions.training_transaction_course
    WHERE course_main = ?
        AND course_enabled = 'enabled'

培训桌:

CREATE TABLE IF NOT EXISTS `training` (
  `course_id` int(11) NOT NULL,
  `course_user` int(11) NOT NULL,
  `course_main` int(11) NOT NULL,
  `course_type` varchar(255) NOT NULL,
  `course_name` varchar(255) NOT NULL,
  `course_description` text NOT NULL,
  `course_location` varchar(255) NOT NULL,
  `course_duration` varchar(255) NOT NULL,
  `course_fitness_type` varchar(255) NOT NULL,
  `course_instructor_name` varchar(255) NOT NULL,
  `course_price` int(15) NOT NULL,
  `course_start_date` date NOT NULL,
  `course_max_attendees` int(8) NOT NULL,
  `course_accommodation` varchar(255) NOT NULL,
  `course_accommodation_price` varchar(255) NOT NULL,
  `course_status` varchar(50) NOT NULL,
  `course_enabled` varchar(10) NOT NULL DEFAULT 'enabled',
  `course_location_name` varchar(255) NOT NULL,
  `course_location_street` varchar(255) NOT NULL,
  `course_location_town` varchar(255) NOT NULL,
  `course_location_county` varchar(255) NOT NULL,
  `course_location_postcode` varchar(255) NOT NULL,
  `course_location_country` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `training`
--

INSERT INTO `training` (`course_id`, `course_user`, `course_main`, `course_type`, `course_name`, `course_description`, `course_location`, `course_duration`, `course_fitness_type`, `course_instructor_name`, `course_price`, `course_start_date`, `course_max_attendees`, `course_accommodation`, `course_accommodation_price`, `course_status`, `course_enabled`, `course_location_name`, `course_location_street`, `course_location_town`, `course_location_county`, `course_location_postcode`, `course_location_country`) VALUES
(1, 3, 4, 'Health & Safety', 'lol', 'This is just a short description, this can be editted', '1', '13', 'lol', 'lol', 5, '1991-02-12', 4, '1', '4', 'live', 'enabled', '', '', '', '', '', 'United Kingdom'),
(2, 3, 4, 'Working at Height', 'lol', '', '1', '11', 'jkjkj', 'kjkjkj', 124, '0000-00-00', 6, '0', '', 'live', 'enabled', '', '123', '123', '123', 'WN8', 'United Kingdom'),
(3, 3, 4, 'Working at Height', 'lol', '', '1', '11', 'jkjkj', 'kjkjkj', 124, '0000-00-00', 6, '0', '', 'live', 'enabled', '', '123', '123', '123', 'WN8', 'United Kingdom');

training_transactions

CREATE TABLE IF NOT EXISTS `training_transactions` (
  `training_transaction_id` int(11) NOT NULL,
  `training_transaction_user` int(11) NOT NULL,
  `training_transaction_course` int(11) NOT NULL,
  `training_transaction_status` varchar(50) NOT NULL DEFAULT 'pending',
  `training_transaction_payment_status` varchar(50) NOT NULL,
  `training_transaction_cost` int(11) NOT NULL,
  `training_transaction_enabled` varchar(50) NOT NULL DEFAULT 'enabled',
  `training_transaction_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `training_transaction_billing_name` varchar(250) NOT NULL,
  `training_transaction_billing_address1` varchar(250) NOT NULL,
  `training_transaction_billing_address2` varchar(250) NOT NULL,
  `training_transaction_billing_city` varchar(250) NOT NULL,
  `training_transaction_billing_state` varchar(250) NOT NULL,
  `training_transaction_billing_postcode` varchar(250) NOT NULL,
  `training_transaction_billing_country` varchar(250) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `training_transactions`
--

INSERT INTO `training_transactions` (`training_transaction_id`, `training_transaction_user`, `training_transaction_course`, `training_transaction_status`, `training_transaction_payment_status`, `training_transaction_cost`, `training_transaction_enabled`, `training_transaction_date`, `training_transaction_billing_name`, `training_transaction_billing_address1`, `training_transaction_billing_address2`, `training_transaction_billing_city`, `training_transaction_billing_state`, `training_transaction_billing_postcode`, `training_transaction_billing_country`) VALUES
(1, 3, 1, 'pending', 'complete', 0, 'enabled', '2015-09-17 14:02:29', *removed my address*);

目前仅显示ID为1的培训课程,因为存在事务中的一行,如果training_transactions中的ID不匹配,我如何显示所有培训?

INNER JOIN仅选择两个表中都存在具有连接键的记录的记录。

使用LEFT JOIN / RIGHT JOIN,可以选择不存在一侧记录的位置; 它们的字段值将为NULL(当计数时,它们应为零,但我不能完全确定)

使用LEFT JOIN而不是内部联接在联接左侧的表中列出所有记录,此外,您需要将count()放在子查询中以从训练表中获取所有字段:

SELECT training.*, ifnull(T.transactioncount,0) as transactioncount
    FROM training
    LEFT JOIN (SELECT training_transaction_course, COUNT(training_transaction_course) as transactioncount FROM training_transactions GROUP BY training_transaction_course) AS T
         ON training.course_id = T.training_transaction_course
    WHERE course_main = ?
        AND course_enabled = 'enabled'

有时使用子查询会更容易。 尝试这个:

SELECT training.*, 
    (SELECT COUNT(distinct training_transactions.training_transaction_course)
     FROM training_transactions
     WHERE training.course_id = training_transactions.training_transaction_course) AS completed_training_payments 
FROM training
WHERE training.course_main = ?
  AND training.course_enabled = 'enabled'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM