MySQL показывает 1242 ошибка

Я новичок в 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 ;

0

Решение

Это слишком долго для комментария.

В чем проблема? У вас есть два подзапроса в 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`,

Вы можете сделать быстрое и грязное исправление, поставив limit 1 после where, Вы можете исправить это, поместив функцию агрегирования в 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 пункт во всех них должен решить проблему.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]