【问题标题】:Count number of text coincidence in all columns of a row计算一行的所有列中的文本重合数
【发布时间】:2014-03-12 23:30:35
【问题描述】:

我正在尝试计算一个单词在一行的所有列中出现的次数,完成了一个 id。

+-------+------+------+------+------+------+------+
| id    | pos1 | pos2 | pos3 | pos4 | pos5 | pos6 |
+-------+------+------+------+------+------+------+
| core1 | AA   | BB   | CC   | HH   | YY   | var1 |
| core2 | AA   | BB   | var3 | TT   | var2 | YY   |
| core5 | AA   | BB   | EE   | GG   | YY   | ZZ   |
+-------+------+------+------+------+------+------+

我已尝试使用此代码,但只返回“1”而不是“2”,这正是我想要的。

SELECT count(id) FROM customize WHERE pos1 OR pos2 OR pos3 OR pos4 OR pos5 OR pos6 LIKE 'var%' AND id = 'core2';

对我该怎么做有什么想法吗?

【问题讨论】:

标签: mysql sql rows


【解决方案1】:
SELECT 
    (IF(pos1 LIKE 'var%', 1, 0) +
    IF(pos2 LIKE 'var%', 1, 0) +
    IF(pos3 LIKE 'var%', 1, 0) +
    IF(pos4 LIKE 'var%', 1, 0) +
    IF(pos5 LIKE 'var%', 1, 0) +
    IF(pos6 LIKE 'var%', 1, 0)) AS done
FROM customize
WHERE id = 'core2'

【讨论】:

  • 如果你想搜索所有id而不是指定id,那么你可以在SQL末尾的SELECT和GROUP BY id中添加id。
  • 其实不需要group by,只要去掉where子句,在选择列表中添加id即可
  • 如果有多个 id 怎么办,@Kevin :) 没有关于 pk 的指示,所以我想确保它在 id 不是 pk 的情况下也能正常工作。
【解决方案2】:

可能会执行大量联合查询(每列一个),然后计算结果。

SELECT COUNT(*) 
FROM
(
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos1 LIKE 'var%'
    UNION ALL
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos2 LIKE 'var%'
    UNION ALL
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos3 LIKE 'var%'
    UNION ALL
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos4 LIKE 'var%'
    UNION ALL
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos5 LIKE 'var%'
    UNION ALL
    SELECT id
    FROM customize 
    WHERE id = 'core2'
    AND pos6 LIKE 'var%'
)

或者,如果您想要计算具有该值的列的行数:-

SELECT COUNT(id)
FROM customize 
WHERE id = 'core2'
AND (pos1 LIKE 'var%' OR pos2 LIKE 'var%' OR pos3 LIKE 'var%' OR pos4 LIKE 'var%' OR pos5 LIKE 'var%' OR pos6 LIKE 'var%')

但更好地规范您的数据库设计

【讨论】:

    【解决方案3】:

    我想你可能想要更多这样的东西:

        select 
         IF(Pos1 LIKE 'var%', 1, 0) +
         IF(Pos2 LIKE 'var%', 1, 0) +
         IF(Pos3 LIKE 'var%', 1, 0) +
         IF(Pos4 LIKE 'var%', 1, 0) +
         IF(Pos5 LIKE 'var%', 1, 0) +
         IF(Pos6 LIKE 'var%', 1, 0) 
     FROM customize
        where id = 'core2'
    

    【讨论】:

    • 如果要计算每个 id,只需删除 where 子句并将 id 添加到选择列表中
    【解决方案4】:

    尝试从概念上分解问题总是有帮助的。解决这个问题有两个阶段。第一个是旋转输入表,将列转换为行。

    第二个是统计字符串的值。

    这是一个同时执行这两个操作的查询 (http://sqlfiddle.com/#!2/3731e/7/0)。

    SELECT COUNT(*) AS stringcount, pos AS string
    FROM (  -- pivot the original table
                      SELECT id, 1 AS i, pos1 AS Pos FROM customize
            UNION ALL SELECT id, 2 AS i, pos2 AS Pos FROM customize
            UNION ALL SELECT id, 3 AS i, pos3 AS Pos FROM customize
            UNION ALL SELECT id, 4 AS i, pos4 AS Pos FROM customize
            UNION ALL SELECT id, 5 AS i, pos5 AS Pos FROM customize
            UNION ALL SELECT id, 6 AS i, pos6 AS Pos FROM customize
    ) AS pivoted
    GROUP BY pos
    ORDER BY COUNT(*) DESC, pos
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2019-08-12
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多