Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表匹配的PHP/SQL查询(通配符)_Php_Mysql_Sql_Match - Fatal编程技术网

表匹配的PHP/SQL查询(通配符)

表匹配的PHP/SQL查询(通配符),php,mysql,sql,match,Php,Mysql,Sql,Match,上次你们帮了大忙,希望我们也能解决我面临的以下挑战 我在同一个数据库中有两个表,并试图匹配字段。以下是我正在使用表名查找的查询,但我无法使其正常工作: 我想匹配表“projects”和列“categorysecond”表“users\u profile”和列“category” projects.categorysecond可能包括示例;“屋顶、窗户、景观”和用户\u profile.category可能只有“屋顶”或“窗户”或“景观”,因此如果来自用户\u profile.category的结

上次你们帮了大忙,希望我们也能解决我面临的以下挑战

我在同一个数据库中有两个表,并试图匹配字段。以下是我正在使用表名查找的查询,但我无法使其正常工作:

我想匹配表“projects”和列“categorysecond”表“users\u profile”和列“category”

projects.categorysecond可能包括示例;“屋顶、窗户、景观”和用户\u profile.category可能只有“屋顶”或“窗户”或“景观”,因此如果来自用户\u profile.category的结果适合于项目,我想从“项目”中提取结果。categorysecond

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

我的尝试样本

$sql = "SELECT DISTINCT users_profiles.username, projects.id FROM users_profiles, projects  WHERE users_profiles.category like '%' + projects.categorysecond + '%'";
这有意义吗?:)


提前谢谢。

您的数据格式非常糟糕。您不应该在逗号分隔的字段中存储内容列表。您在这个查询中遇到的问题只是这些问题的一个例子。您无法让这样的查询利用索引或其他优化技术

select  distinct 
        up.username
       ,p.id 
from   users_profiles  as up
        join    projects as p
        on      concat(',',p.categorysecond,',') like concat('%,',up.category,',%')
有时,我们会被其他人糟糕的设计决策所困扰。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;

注意:如果您不需要
不同的
,则不要包含它。这只会导致性能下降。

编辑您的问题,并在问题中以表格形式提供示例数据和所需结果。其次,将事物列表存储为逗号分隔的字符串是一个非常非常非常糟糕的主意。你应该解释为什么你选择了如此糟糕的方式来表示类别关系。上面添加了我尝试的示例。谢谢。:-)不客气。请别忘了接受回答Hello@dudu!现在我做了更多的测试,这没什么问题。当my field users.profiles(类别)具有屋顶,而my field projects(categorysecond)具有屋顶时,它确实会拉取一个结果。但是,只要我输入另一个categorysecond并在屋顶之后存储它(例如Roof;Paint;),它就不再找到屋顶。我采纳了Gordon Linoff的建议,从word1、word2、word3重新格式化了categorysecond中的所有条目;至第1字;字2;字3;此外,我按照Gordon Linoff的建议尝试了find_in_set(),但没有得到任何结果。有什么想法吗?当前的查询是:从用户配置文件中选择不同的p.id、p.categorysecond、p.enteredtime、p.startdate、p.city、p.province作为向上连接项目,如concat上的p('、'、p.categorysecond'、')、concat('、'、up.category'、%)、p.status,如“如果您将数据中的分隔符从
更改为
concat(“;”,p.categorysecond,“;”)中的分隔符,例如concat(“%;”,up.category“;”)
)。这是这篇文章的正确答案,所以请接受它。你好,戈登,看来我仍然有一些挑战。我接受了你们的一些反馈,但从上面看到了我的回复。