【发布时间】:2014-09-25 22:22:37
【问题描述】:
我是Views 的新手。我创建了以下视图
DELIMITER $$
USE `My_db`$$
DROP VIEW IF EXISTS `view_affiliate_banner_info_earning_details`$$
CREATE ALGORITHM=UNDEFINED DEFINER=`user`@`%` SQL SECURITY DEFINER VIEW `view_affiliate_banner_info_earning_details` AS (
SELECT DISTINCT
`m`.`member_id` AS `member_id`,
(SELECT
(CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END)
FROM `view_member_cash_back` `v_cb`
WHERE (`v_cb`.`member_id` = `m`.`member_id`)) AS `my_kash_back`,
(SELECT
(CASE WHEN (`v_gk`.`status` = 'upgrade') THEN `v_gk`.`status` ELSE CONVERT((CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) USING latin1) END)
FROM `view_good_bonus` `v_gk`
WHERE (`v_gk`.`cash_back_to` = `m`.`member_id`)) AS `my_community_kash`,
CONCAT(TRUNCATE(((SELECT (CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END) FROM `view_member_cash_back` `v_cb` WHERE ((`v_cb`.`member_id` = `m`.`member_id`) AND (`v_cb`.`status` = 'pending'))) + (SELECT (CASE WHEN (`v_gk`.`status` = 'upgrade') THEN '0.00' ELSE (CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) END) FROM `view_good_bonus` `v_gk` WHERE ((`v_gk`.`cash_back_to` = `m`.`member_id`) AND (`v_gk`.`status` = 'pending')))),2)) AS `pending`,
CONCAT(TRUNCATE(((SELECT (CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END) FROM `view_member_cash_back` `v_cb` WHERE ((`v_cb`.`member_id` = `m`.`member_id`) AND (`v_cb`.`status` = 'available'))) + (SELECT (CASE WHEN (`v_gk`.`status` = 'upgrade') THEN '0.00' ELSE (CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) END) FROM `view_good_bonus` `v_gk` WHERE ((`v_gk`.`cash_back_to` = `m`.`member_id`) AND (`v_gk`.`status` = 'available')))),2)) AS `available`
FROM ((`view_members` `m`
LEFT JOIN `view_member_cash_back` `v_cb`
ON ((`m`.`member_id` = `v_cb`.`member_id`)))
LEFT JOIN `view_good_bonus` `v_gk`
ON ((`m`.`member_id` = `v_gk`.`cash_back_to`)))
WHERE 1
ORDER BY `m`.`member_id`)$$
DELIMITER ;
在创建时它没有给我任何错误,但是当我想在这个视图中查看数据时,它给了我以下错误 子查询返回超过 1 行
更新
我像这样更改了查询,但还是一样
DELIMITER $$
USE `my_db`$$
DROP VIEW IF EXISTS `view_affiliate_banner_info_earning_details`$$
CREATE ALGORITHM=UNDEFINED DEFINER=`user`@`%` SQL SECURITY DEFINER VIEW `view_affiliate_banner_info_earning_details` AS (
SELECT DISTINCT
`m`.`member_id` AS `member_id`,
(SELECT
(CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END)
FROM `view_member_cash_back` `v_cb`
WHERE (`v_cb`.`member_id` = `m`.`member_id`) LIMIT 1) AS `my_kash_back`,
(SELECT
(CASE WHEN (`v_gk`.`status` = 'upgrade') THEN `v_gk`.`status` ELSE CONVERT((CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) USING latin1) END)
FROM `view_good_bonus` `v_gk`
WHERE (`v_gk`.`cash_back_to` = `m`.`member_id`) LIMIT 1) AS `my_community_kash`,
CONCAT(TRUNCATE(((SELECT (CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END) FROM `view_member_cash_back` `v_cb` WHERE ((`v_cb`.`member_id` = `m`.`member_id`) AND (`v_cb`.`status` = 'pending'))) + (SELECT (CASE WHEN (`v_gk`.`status` = 'upgrade') THEN '0.00' ELSE (CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) END) FROM `view_good_bonus` `v_gk` WHERE ((`v_gk`.`cash_back_to` = `m`.`member_id`) AND (`v_gk`.`status` = 'pending')))),2)) AS `pending`,
CONCAT(TRUNCATE(((SELECT (CASE WHEN ISNULL(ROUND(SUM(`v_cb`.`kash_back`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_cb`.`kash_back`),2),2) END) FROM `view_member_cash_back` `v_cb` WHERE ((`v_cb`.`member_id` = `m`.`member_id`) AND (`v_cb`.`status` = 'available'))) + (SELECT (CASE WHEN (`v_gk`.`status` = 'upgrade') THEN '0.00' ELSE (CASE WHEN ISNULL(ROUND(SUM(`v_gk`.`good_bonus`),0)) THEN '0.00' ELSE TRUNCATE(ROUND(SUM(`v_gk`.`good_bonus`),2),2) END) END) FROM `view_good_bonus` `v_gk` WHERE ((`v_gk`.`cash_back_to` = `m`.`member_id`) AND (`v_gk`.`status` = 'available')))),2)) AS `available`
FROM ((`view_members` `m`
LEFT JOIN `view_member_cash_back` `v_cb`
ON ((`m`.`member_id` = `v_cb`.`member_id`)))
LEFT JOIN `view_good_bonus` `v_gk`
ON ((`m`.`member_id` = `v_gk`.`cash_back_to`)))
WHERE 1
ORDER BY `m`.`member_id`)$$
DELIMITER ;
【问题讨论】:
-
v_cb 或 v_gk 都返回每个 member_id 的多行。仅根据名称,我会先查看 v_gk,然后应用其他一些约束使其仅拉 1 行。
-
我通过再次创建此视图来修复它,由于我的表中的数据重复,这搞砸了
标签: php mysql view mysql-error-1064