【问题标题】:mysql view is showing 1242 errormysql视图显示1242错误
【发布时间】: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


【解决方案1】:

评论太长了。

有什么问题? select 子句中有两个子查询。其中之一是返回不止一排。快速修复方法是将limit 1 添加到两个子查询中。

事实上,我们可以缩小范围。第一个子查询是一个聚合子查询,所以它只返回一行。问题是第二个:

  (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`,

您可以通过在where 之后放置limit 1 来快速进行修复。您可以通过在 select 子句中放置一个聚合函数来修复它(与第一个查询一样)。或者,您可以找出数据的行为方式与您认为的不同的原因,并酌情修复数据或查询,或两者兼而有之。

编辑:

当我第一次回答时,我错过了两个以上的相关子查询,而不是其他的在这些表达式中(不方便滚动页面):

  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`

其中一个也可能返回多行,因此在所有这些中包含limit 1 子句应该可以解决问题。

【讨论】:

  • 它执行得很好,但是当我去查看数据时,它给出了同样的错误。查看我的更新,我更改了查询
  • @baig772 。 . .我错过了最后两个相关的子查询。这一定是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2020-03-10
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多