如果一列有多个关键字,我如何从数据库中获取结果?

Posted

技术标签:

【中文标题】如果一列有多个关键字,我如何从数据库中获取结果?【英文标题】:How can i get the result from DB if one column have several keywrods? 【发布时间】:2014-08-14 18:10:23 【问题描述】:

嗯,我有一个名为 keywords 的表,有 2 列。

1) 孩子 2)关键字(关键字值)

我还有一个名为contact_details 的表,其中有一列名为keyword。在这个keyword 列中,我从keywordstable 插入了许多keyword。所以2张桌子看起来像这样......

关键字表:

kid    keyword
1      php     
1      mysql     
1      html     
1      css     
1      css3     
1      wp     
1      photoshop     
1      3d

contact_details 表:

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_details 表中获取与search keyword/s 匹配的所有名称?

keywords 表中是否需要添加任何字段?无法获得 IDEA :(

【问题讨论】:

您不应将关键字添加到contact_details 表中。相反,您应该添加一个表格,将关键字 ID 与联系人 ID 连接起来。 在这里同意 jeroen。首先规范化你的数据,然后它会变得容易得多。 @jeroen 可能你是对的。 @jeroen 好吧,假设我用cidkidkeywords 构建了一个名为searchKeyword 的表。那么 Sql 查询应该是什么? @jeroen 你能告诉我sql查询部分吗?在这个新表列中可能是skidcidkidkeyword 【参考方案1】:
Select name from contact_details where keyword like '%<search keywords>%'

像搜索关键字键 php 一样,你需要在查询中传递 php,并会得到所有关键字为 php' 的名称的列表

Select name from contact_details where keyword like '%php%'

希望这能解决您的问题。

正确的方法, 将孩子作为关键字表中的主键

Keywords table:
kid    keyword
1      php     
2      mysql     
3      html 

从contact_details 表中删除关键字列。

contact_details table:
cid    name    phone   
1      alex    123     
2      alex1   124     
3      alex2   125 

再制作一张多对多关系的表,你需要在此处插入关系,这样就不需要再次触摸关键字和contact_details表了。

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查询(未测试也可以使用别名)

select name from contact_details join keyword_contact_mapping on kid_fk =(select kid from Keywords where keyword='php')

【讨论】:

感谢您的回答。好的,现在我从contact_details 表中删除了关键字列,并创建了一个名为searchKeyword 的新表,其中包含skidcidkidkeyword。那么Sql Query应该是什么呢? 我已经更新了我的答案,请检查它是否适合你,但是 sql 查询未经测试。 很好的答案!但如果我同时搜索phpsqlhtml,那么? 那么只需要在查询 where 关键字 IN ('php','mysql','html') 中使用 IN 运算符 你明白了!!伟大的帮助,太棒了。非常感谢@prashant thakre。【参考方案2】:

假设你有选择名字时的ID,你可以使用:

    SELECT Keyword from Keywords_Table
    WHERE ID = <ID>

【讨论】:

【参考方案3】:
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

【讨论】:

以上是关于如果一列有多个关键字,我如何从数据库中获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

sql一列有多值查询,根据多个只查询我想要的数据

如何将EXCEL表格中的同一列有相同的内容 合并成一个单元格?

添加行时如何获取表列的值

数据表中的多选行,如何从JSON获取一列数据到php

SQL group by:选择另一列有其最小值/最大值的值

excel中如何检查一列中的内容是不是包含在另一个文档的一列中。