Php 如果一列有多个keywrod,如何从DB中获得结果?
嗯,我有一个名为Php 如果一列有多个keywrod,如何从DB中获得结果?,php,mysql,sql,Php,Mysql,Sql,嗯,我有一个名为关键字的表,有两列 1) 孩子 2) 关键词(关键词值) 我还有一个名为contact\u details的表,其中有一列名为keyword。在这个关键字列中,我从关键字表中插入了许多关键字。两张桌子是这样的 关键字表: kid keyword 1 php 1 mysql 1 html 1 css 1 css3 1 wp 1 photoshop
关键字的表,有两列
1) 孩子
2) 关键词(关键词值)
我还有一个名为contact\u details
的表,其中有一列名为keyword
。在这个关键字
列中,我从关键字
表中插入了许多关键字
。两张桌子是这样的
关键字表:
kid keyword
1 php
1 mysql
1 html
1 css
1 css3
1 wp
1 photoshop
1 3d
联系人详情表:
cid name phone keyword
1 alex 123 php, mysql, hmtl
2 alex1 124 php, html, css3
3 alex2 125 wp, html, css
4 alex3 126 photoshop, 3d
5 alex4 127 html, 3d, php
6 alex5 128 mysql, wp, html
现在我有了一个搜索框,它通过使用关键字值搜索人员(姓名来自contact_details表)。在搜索框中,搜索值可以是几个关键字。我的意思是它可以是php、mysql、html
,也可以是php、3d、photoshop
因此,我的问题是:如何编写Sql查询来获得结果?我想从contact\u details
表中获取与search关键字/s
匹配的所有姓名
是否需要在关键字表中添加任何字段?无法理解:(如果您在选择名称时具有ID,则可以使用:
SELECT Keyword from Keywords_Table
WHERE ID = <ID>
从关键字表中选择关键字
其中ID=
希望这能解决你的问题。
正确的做法,,
将kid作为关键字表中的主键
Keywords table:
kid keyword
1 php
2 mysql
3 html
从联系人详细信息表中删除关键字列
contact_details table:
cid name phone
1 alex 123
2 alex1 124
3 alex2 125
再制作一个具有多对多关系的表,您需要在此处插入关系,以便无需再次触摸关键字和联系人详细信息表
keyword_contact_mapping
kcid kid_fk cid_fk
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1
6 2 2
7 2 3
Sql查询(未测试,也可以使用别名)
您不应该将关键字添加到contact\u details
表中。相反,您应该添加一个将关键字ID与联系人ID连接起来的表。在这里同意jeroen的意见。首先规范化您的数据,然后它会变得更容易。@jeroen可能是对的。@jeroen好的,让我们认为我用构建了一个名为searchKeyword
的表ode>cid
,kid
和keywords
。那么Sql查询应该是什么呢?@jeroen你能给我看看Sql查询部分吗?在这个新表中,列可以是skid
,cid
,kid
和关键字
。谢谢你的回答。现在我从contact\u details
中删除了关键字列表,并创建了一个名为searchKeyword
的新表,该表包含skid
、cid
、kid
和keyword
。那么Sql查询应该是什么?我已经更新了我的答案,请检查它是否适合您,但是Sql查询没有测试。回答得很好!但是如果我搜索php
,Sql
,>html
同时,然后呢?那么你只需要在查询中使用in运算符where关键字in('php','mysql','html')你就知道了!!太棒了,太棒了。非常感谢@prashant thakre。
contact_details table:
cid name phone
1 alex 123
2 alex1 124
3 alex2 125
keyword_contact_mapping
kcid kid_fk cid_fk
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1
6 2 2
7 2 3
select name from contact_details join keyword_contact_mapping on kid_fk =(select kid from Keywords where keyword='php')
USE AdventureWorksDW2008R2
GO
IF OBJECT_ID('Keywords') IS NOT NULL
BEGIN
DROP TABLE Keywords
END
IF OBJECT_ID('Contact_Details') IS NOT NULL
BEGIN
DROP TABLE Contact_Details
END
IF OBJECT_ID('Keyword_ContactDetails') IS NOT NULL
BEGIN
DROP TABLE Keyword_ContactDetails
END
/* automate id's with identity. Or, do you want to specify the the keyword id manually?
*/
CREATE TABLE Keywords(
Keywords_ID INT IDENTITY(1,1) NOT NULL
,Keyword NVARCHAR(100)
CONSTRAINT PK_Keywords PRIMARY KEY
(
Keywords_ID
)
)
/* You must plan each column data type by careful consideration
I am using the phone example here to demonstrate different business requirements
the lenghts and datatype may need to change for localization
*/
CREATE TABLE Contact_Details
(
Contact_Details_ID INT IDENTITY(1,1) NOT NULL
,First_Name VARCHAR(100)
,Last_Name VARCHAR(100)
,Phone VARCHAR(10)
,Phone_EXT VARCHAR(3)
,Phone_International NVARCHAR(15)
CONSTRAINT PK_Contact_Details PRIMARY KEY
(
Contact_Details_ID
)
)
CREATE TABLE Keyword_ContactDetails
(
Keyword_ID INT
,Contact_Details_ID INT
,DateTime_Created DATETIME
CONSTRAINT PK_KeywordContact PRIMARY KEY
(
Keyword_ID
,Contact_Details_ID
)
/*Enforce referential integrity,
prevents adding keywords that don't exist
prevents deleting a keyword if it is referenced
*/
FOREIGN KEY (Keyword_ID) REFERENCES Keywords(Keywords_ID),
FOREIGN KEY (Contact_Details_ID) REFERENCES Contact_Details(Contact_Details_ID)
)
/* Populate keywords
*/
INSERT INTO Keywords(Keyword) VALUES ('PHP')
INSERT INTO Keywords(Keyword) VALUES ('MYSQL')
INSERT INTO Keywords(Keyword) VALUES ('HTML')
INSERT INTO Keywords(Keyword) VALUES ('CSS')
/* Add contact details
*/
INSERT INTO Contact_Details(
First_Name
,Last_Name
,Phone
,Phone_EXT
,Phone_International)
VALUES(
'Abe'
,'Lincoln'
,'2129996677'
,'123'
,'na')
/* Assign PHP Keyword to Abe Lincoln
*/
DECLARE @keywordID int = 0
,@contactDetails int = 0
set @keywordID = (select Keywords_ID from Keywords where Keyword = 'PHP')
set @contactDetails = (select Contact_Details_ID from Contact_Details where Last_Name = 'Lincoln')
INSERT INTO Keyword_ContactDetails(
Keyword_ID
,Contact_Details_ID
,DateTime_Created)
VALUES(
@keywordID
,@contactDetails
,CURRENT_TIMESTAMP)
SELECT * FROM Contact_Details C
JOIN Keyword_ContactDetails KC
ON KC.Contact_Details_ID = C.Contact_Details_ID
JOIN Keywords K
ON K.Keywords_ID = KC.Keyword_ID