首页 > 解决方案 > 在表中搜索动词+名词

问题描述

信息

我有一张列出动词和形容词的表格。我还有一张列出名词的表格。我的第三张表是我们的搜索字段。

我想做什么?

我想在我们的搜索字段表中搜索动词 + 形容词。所以我想找到动词+名词形容词+名词

例子

我们的搜索字段表中有记录:

  1. 建墙
  2. 红树
  3. 数友
  4. 购买苹果

结论

所以我的动词+形容词表和名词表中有这些词(build,wall,red,tree,purchase,apple,count,you) 我怎样才能按我的名词和形容词+动词表的正确顺序找到它们?我的意思是正确的顺序应该是动词+名词形容词+名词

Ps:你知道有时我们需要英语介词。但我不介意他们在那次搜索中。不要介意介词这些类型的结果对我来说是正确的:

动词+(任何字符)+名词

形容词+(任何字符)+名词

我试过什么?

好吧,我尝试了一个 sql 查询:

SELECT * FROM adjectiveVerbList INNER JOIN searchField ON searchField.text LIKE CONCAT('%',adjectiveVerbList.word, '%')

但正如您所见,这个查询只是一个简单的类似查询。这没用。顺便说一句,我可以用 php 或只是一个 sql 查询来做这没关系。

编辑:我的表:

CREATE TABLE `adjectiveVerbList` (
  `id` int(10) UNSIGNED NOT NULL,
  `word` varchar(100) NOT NULL,
  `type` enum('adjective','verb') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `adjectiveVerbList` (`id`, `word`, `type`) VALUES
(1, 'abandoned', 'adjective'),
(2, 'able', 'adjective'),
(3, 'absolute', 'adjective'),
(4, 'adorable', 'adjective'),
(5, 'adventurous', 'adjective'),
(6, 'academic', 'adjective'),
(7, 'acceptable', 'adjective'),
(8, 'acclaimed', 'adjective'),
(9, 'accomplished', 'adjective'),
(10, 'accurate', 'adjective'),
(11, 'aching', 'adjective'),
(12, 'acidic', 'adjective'),
(13, 'acrobatic', 'adjective'),
(14, 'active', 'adjective'),
(2363, 'whip', 'verb')



CREATE TABLE `nounList` (
  `id` int(10) UNSIGNED NOT NULL,
  `word` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Tablo döküm verisi `nounList`
--

INSERT INTO `nounList` (`id`, `word`) VALUES
(1, 'ATM'),
(2, 'CD'),
(3, 'SUV'),
(4, 'TV'),
(5, 'aardvark'),
(6, 'abacus'),
(7, 'abbey'),
(8, 'abbreviation'),
(9, 'abdomen'),
(10, 'ability')


CREATE TABLE `searchField` (
  `id` int(10) UNSIGNED NOT NULL,
  `word` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `searchField` (`id`, `word`) VALUES
(1, 'buildawall')
(2, 'redtree')
(3, 'greenmybuild')
...

输入

buildawall(来自 searchField 表)

输出

这是正确的,因为我们有来自adjectiveVerbList的“build”词和来自nounList表的“wall” 。并且构建在墙之前,因此它是可读的。

标签: phpsql

解决方案


更改为您的对象名称。我将数据放入前面的 WITH 子句中,我将标记“真实”查询的开始位置。不过,你没有指定你想要的输出,所以我只是假设了一些东西。我使用了与您的第一个搜索词组匹配的数据。

WITH
-- input ....
phrases(id,phrase) AS (
          SELECT 1,'buildawall'
UNION ALL SELECT 2,'redtree'
UNION ALL SELECT 3,'countonyou'
UNION ALL SELECT 4,'purchaseanapple'
)
,
adjectiveverblist (id,word,type) AS (
          SELECT 1,'build'    ,'verb'
UNION ALL SELECT 2,'red'      ,'adjective'
UNION ALL SELECT 3,'count'    ,'verb'
UNION ALL SELECT 4,'purchase' ,'verb'
)
,
nounlist(id,word) AS (
          SELECT 1,'wall'
UNION ALL SELECT 2,'tree'
UNION ALL SELECT 3,'you'
UNION ALL SELECT 4,'apple'
)
-- end of input - real query starts here ...
SELECT
  phrase
, av.word AS adjective_verb
, av.type AS av_type
, n.word  AS noun
FROM phrases
JOIN adjectiveverblist av ON phrase LIKE '%' + av.word + '%'
JOIN nounlist n ON phrase LIKE '%' + n.word + '%'
;
-- out      phrase      | adjective_verb |  av_type  | noun  
-- out -----------------+----------------+-----------+-------
-- out  redtree         | red            | adjective | tree
-- out  buildawall      | build          | verb      | wall
-- out  countonyou      | count          | verb      | you
-- out  purchaseanapple | purchase       | verb      | apple


推荐阅读