【问题标题】:group by alternate spellings按替代拼写分组
【发布时间】:2014-09-09 00:04:51
【问题描述】:

我有一个包含预期列的地址表(公寓、房屋、街道、邮政编码、国家等)。

我正在使用 PHP 从表单输入 ($street) 执行 MySQL 搜索。我已经成功做到了,所以我可以通过所有道路拼写变体(例如:'street'、'st'、'st.')进行搜索,如下所示。我希望输出数组按街道分组。以下按每个单独的拼写分组。有没有办法让我的返回组包含所有拼写变体?

我的代码

<?php
    $results = $db->prepare(
        "SELECT * FROM entries
        WHERE 
        street = :street
        OR street = REPLACE(:street, 'st', 'street')
        OR street = REPLACE(:street, 'st.', 'street')
        OR street = REPLACE(:street, 'st.', 'st')
        OR street = REPLACE(:street, 'street', 'st')
        OR street = REPLACE(:street, 'street', 'st.')

        GROUP BY street, house
    ")

    $results->bindParam(':street', $street);
    $results->execute();

    $output = $results->fetchAll(PDO::FETCH_ASSOC);    
    return $output;
?>

当前示例输出

[1] Church Street
    [1] 12 Church Street
    [2] 25 Church Street
[2] Church St.
    [1] 19 Church St.

所需的示例输出

[1] Church Street
    [1] 12 Church Street
    [2] 25 Church Street
    [3] 19 Church St.

【问题讨论】:

  • 这条街叫“圣奥古斯丁街”是什么?它将成为“奥古斯丁街”。
  • 很好看。这是搜索,不是输入,所以搜索不存在的东西不是问题:)
  • 在没有任何聚合函数的情况下,您使用 GROUP BY 子句是不合适的
  • @Strawberry我是新手,但我认为你不需要在MySQL中分组之前进行聚合?dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
  • 你这样做,因为否则你(可能)返回无意义的结果。这里有一些非常有经验的用户主张在与此类似的情况下使用它——它已经展示了微小的性能优势——但我认为它太容易被滥用。

标签: php mysql group-by


【解决方案1】:

我认为您的数据存在与您在 where 子句中尝试处理的问题相同的问题。纠正地址可能是一个挑战。下面是这个小例子的尝试:

SELECT *
FROM entries
WHERE street = :street
      OR street = REPLACE(:street, 'st', 'street')
      OR street = REPLACE(:street, 'st.', 'street')
      OR street = REPLACE(:street, 'st.', 'st')
      OR street = REPLACE(:street, 'street', 'st')
      OR street = REPLACE(:street, 'street', 'st.')
GROUP BY (case when street like '%st' then concat(street, 'reet')
               when street like '% st.' then replace(street, ' st.', ' street')
               else street
          end), house;

编辑:

您应该重复 group by expression in theselect` 子句:

SELECT (case when street like '%st' then concat(street, 'reet')
             when street like '% st.' then replace(street, ' st.', ' street')
             else street
        end) as street, house
FROM entries
WHERE street = :street
      OR street = REPLACE(:street, 'st', 'street')
      OR street = REPLACE(:street, 'st.', 'street')
      OR street = REPLACE(:street, 'st.', 'st')
      OR street = REPLACE(:street, 'street', 'st')
      OR street = REPLACE(:street, 'street', 'st.')
GROUP BY (case when street like '%st' then concat(street, 'reet')
               when street like '% st.' then replace(street, ' st.', ' street')
               else street
          end), house;

【讨论】:

  • 谢谢戈登。 concat 有效,但替换行会导致 SQL 错误。我猜语法有问题。我是一个完整的新手,所以任何帮助表示赞赏。
  • 知道了。它是 "then concat(street, 'reet')," 末尾的附加逗号
  • 好的,所以这有点工作。它确实将它们组合在一起,但它对每个拼写都进行了处理,所以基本上我最终得到了 2 个数组(Church St. 和 Church Street),每个数组都包含相同的 3 条记录。您能否就如何按照您的建议对它们进行分组提出任何建议,但仅将它们显示在“教堂街”下?提前致谢。
猜你喜欢
  • 2019-01-03
  • 2010-09-10
  • 2022-01-09
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多