【问题标题】:PHP/SQL Query where tables match (wildcard)PHP/SQL 查询表匹配的位置(通配符)
【发布时间】:2017-02-12 15:49:59
【问题描述】:

上次你们非常乐于助人,希望我们也能解决我遇到的以下挑战。

我在同一个数据库中有 2 个表并尝试匹配字段。这是我正在使用表名查找的查询,但是我无法让它工作:

我想匹配表“projects”和列“categorysecond”表“users_profile”和列“category”。

projects.categorysecond 可能包括示例; “屋顶、窗户、景观”和 users_profile.category 可能只有“屋顶”或“窗户”或“景观”,所以如果 users_profile.category 的结果适合 projects.categorysecond,我想从“项目”中提取结果

***重要 - 我没有唯一标识符来对示例 ID 进行内部连接。如果一个单词(%Wildcard)与另一个匹配,则唯一匹配的应该是上面列出的表格。

我的尝试示例

$sql = "SELECT DISTINCT users_profiles.username, projects.id FROM users_profiles, projects  WHERE users_profiles.category like '%' + projects.categorysecond + '%'";

这有意义吗? :)

提前谢谢你。

【问题讨论】:

  • 编辑您的问题并在问题中以表格格式提供示例数据和所需结果。其次,将事物列表存储为逗号分隔的字符串是一个非常、非常、非常、非常糟糕的主意。你应该解释为什么你选择了如此糟糕的方式来表示类别关系。
  • 添加了我上面尝试的示例。谢谢。

标签: php mysql sql match


【解决方案1】:
select  distinct 
        up.username
       ,p.id 
from   users_profiles  as up
        join    projects as p
        on      concat(',',p.categorysecond,',') like concat('%,',up.category,',%')

【讨论】:

  • :-) 不客气。请不要忘记接受答案
  • 你好@dudu!小问题现在我做了更多的测试。当我的字段 users.profiles(category) 具有 Roofing 并且我的字段 projects(categorysecond) 具有 Roofing 时,它确实会拉出结果但是,只要我输入另一个 categorysecond 并将其存储在 Roofing 之后(例如 Roofing;Painting;)它就不再找到屋顶。我接受了 Gordon Linoff 的建议,并从 word1、word2、word3 中重新格式化了 categorysecond 中的所有条目;到 word1;word2;word3;另外,我按照 Gordon Linoff 的建议尝试了 find_in_set(),但没有得到任何结果。有什么想法吗?
  • 当前查询是:SELECT distinct p.id, p.categorysecond, p.enteredtime, p.startdate, p.city, p.province FROM users_profiles as up join projects as p ON concat(', ',p.categorysecond,',') like concat('%,',up.category,',%') AND p.status LIKE ''
  • 如果您将数据中的分隔符从 , 更改为 ;,那么您还应该更改查询中的分隔符 (concat(';',p.categorysecond,';') like concat('%;',up.category,';%'))。这是此帖子的正确答案,因此请接受。
【解决方案2】:

您的数据格式非常糟糕。您不应该将事物列表存储在逗号分隔的字段中。您在使用此查询时遇到的问题只是问题的一个示例。您无法让此类查询利用索引或其他优化技术。

有时,我们会被其他人非常糟糕的设计决策所困扰。 MySQL 有函数find_in_set() 在这种情况下有效:

SELECT DISTINCT up.username, p.id
FROM users_profiles up JOIN
     projects p 
     ON find_in_set(up.category, p.categorysecond) > 0;

注意:如果您不需要 DISTINCT,请不要包含它。它只会导致性能损失。

【讨论】:

  • 你好,戈登,看来我还有一些挑战。我接受了你们中的一些反馈,但请参阅上面的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
相关资源
最近更新 更多