MySQL在UNION SELECT上计算整数值并显示为值

MySQL在UNION SELECT上计算整数值并显示为值,mysql,Mysql,我有一个使用此查询的表: SELECT id, channel FROM ( SELECT s.id, c.sort, s.channel FROM streams s, channels c WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL AND JSON_SEARCH(c.sort, 'on

我有一个使用此查询的表:

SELECT id, channel  
FROM (
    SELECT s.id, c.sort, s.channel 
    FROM streams s, channels c 
    WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL  

    UNION 

    SELECT m.marker, c.sort, m.channel 
    FROM markers m, channels c, streams s 
    WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
    AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) ch 
ORDER BY LOCATE(CONCAT('"', id, '"'), sort);
返回此表:

+----+----------+
| id | channel  |
+----+----------+
| m2 | AAA      |
| 1  | CC_DDD   |
| 2  |  DD_EEE  |
| 11 | FF_GGG   |
| m4 | BBB      |
| m3 | CCC      |
| m5 | MMM      |
| m1 | GGGG     |
+----+----------+
现在我需要计算id字段,但只计算整数值,因此我尝试添加:

SELECT id, channel, COUNT(id) AS values...
但我得到了这个错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values FROM 
(SELECT s.id, c.sort, s.channel FROM streams s, channels c WHERE JS' at line 1
所以我需要得到这个:

+----+----------+--------+
| id | channel  | values |
+----+----------+--------+
| m2 | AAA      |   3    |
| 1  | CC_DDD   |        |
| 2  | DD_EEE   |        |
| 11 | FF_GGG   |        |
| m4 | BBB      |        |
| m3 | CCC      |        |
| m5 | MMM      |        |
| m1 | GGGG     |        |
+----+----------+--------+
重点是我只需要计算整数值,而不是以m(m2,m4,m3,m5,m1)开头的值


使用此单个查询是否可以返回计数值,还是需要同时运行两个查询?

您需要加入一个子查询以返回所需的计数值

SELECT id, channel, y.count
FROM (
    SELECT s.id, c.sort, s.channel 
    FROM streams s, channels c 
    WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL  

    UNION 

    SELECT m.marker, c.sort, m.channel 
    FROM markers m, channels c, streams s 
    WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
    AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) ch 
CROSS JOIN (
    SELECT SUM(count) AS count
    FROM (
        SELECT SUM(s.id RLIKE '^[0-9]+$') AS count
        FROM streams s, channels c 
        WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL 
        UNION ALL
        SELECT SUM(s.id RLIKE '^[0-9]+$') AS count
        FROM markers m, channels c, streams s 
        WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
        AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) AS x) AS y
ORDER BY LOCATE(CONCAT('"', id, '"'), sort);

这将把计数放在结果的每一行,而不仅仅是第一行。您可以在显示代码中过滤掉它。

您需要加入一个子查询,返回您想要的计数

SELECT id, channel, y.count
FROM (
    SELECT s.id, c.sort, s.channel 
    FROM streams s, channels c 
    WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL  

    UNION 

    SELECT m.marker, c.sort, m.channel 
    FROM markers m, channels c, streams s 
    WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
    AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
    AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) ch 
CROSS JOIN (
    SELECT SUM(count) AS count
    FROM (
        SELECT SUM(s.id RLIKE '^[0-9]+$') AS count
        FROM streams s, channels c 
        WHERE JSON_SEARCH(s.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL 
        UNION ALL
        SELECT SUM(s.id RLIKE '^[0-9]+$') AS count
        FROM markers m, channels c, streams s 
        WHERE JSON_SEARCH(m.bouquet, 'one', 1) IS NOT NULL 
        AND JSON_SEARCH(c.bouquet, 'one', 1) IS NOT NULL
        AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL) AS x) AS y
ORDER BY LOCATE(CONCAT('"', id, '"'), sort);

这将把计数放在结果的每一行,而不仅仅是第一行。您可以在显示代码中将其过滤掉。

是保留字。请使用其他别名或将其放在反勾号中。有关如何测试字段是否为数字的信息,请参阅。您可以使用
SUM(id REGEXP'^[0-9]+$)
来计算数值的数量。我在将计数添加到选择查询时遇到问题,它需要位于其他位置,但我不知道在哪里?为什么要添加
count
?你没有计算任何东西,你需要对比较结果求和。
是一个保留字。请使用其他别名或将其放在反勾号中。有关如何测试字段是否为数字的信息,请参阅。您可以使用
SUM(id REGEXP'^[0-9]+$)
来计算数值的数量。我在将计数添加到选择查询时遇到问题,它需要位于其他位置,但我不知道在哪里?为什么要添加
count
?你没有计算任何东西,你需要对比较结果求和。谢谢..它有效..但我添加了COUNT not sum(用sum我得到了23作为y.COUNT,用COUNT我得到了3,这是正确的结果)…谢谢…大…大票赞成正确和详细的答案我不知道这将如何只计算数字ID。谢谢..它有效..但我添加了COUNT not sum(加起来我得到了23个y.count,加上count,我得到了3个,这是正确的结果)…谢谢…大…大票支持正确和详细的答案我不知道这将如何只计算数字ID。