匹配两个表中的记录

时间:2019-11-02 12:56:15

标签: mysql sql

我有两个表:ads_info和ads。

我想匹配两个表中的记录。

广告的SQL模式:

| id |                 title |
|----|-----------------------|
|  1 | This Dog is very nice |

ads_info的SQL架构:

| id |                     infotext |       tag |
|----|------------------------------|-----------|
|  1 | Dogs can eat a lot of things | dog, pets |

我想检查ID为1的广告的标题中ads_info中是否有标签。我已经尝试过了:

SELECT * FROM `ads` where id = '1' UNION
SELECT * FROM `ads_info` where tag like '%ads.title%'

此处是SQL字段:LINK

2 个答案:

答案 0 :(得分:0)

您要一个简单的join吗?

select a.*, ai.tag,
       (tag like concat('%', ads.title, '%')) as flag
from ads a join
     ads_info ai
     on ai.id = a.id;

flag当然是错误的。很难表达出您所表达的逻辑的结果。

答案 1 :(得分:0)

您可以通过这种方式做到这一点:DEMO我相信还有更好的方法,甚至可以更好地执行此示例:)但这可能会有所帮助...

首先,您要创建拆分功能和在表中插入这些值的过程(我在这里使用LINK的答案并纠正了一些小错误):

功能

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

过程

CREATE PROCEDURE ABC(in fullstr VARCHAR(255))

BEGIN

DECLARE a int default 0;
DECLARE str VARCHAR(255);

      simple_loop: LOOP
         SET a=a+1;
         SET str=SPLIT_STR(fullstr,",",a);
         IF str='' THEN
            LEAVE simple_loop;
         END IF;

         insert into my_temp_table values (str);
      END LOOP simple_loop;
END;

我已经为此值创建了一个表:

create table my_temp_table (temp_columns varchar(100));

调用了过程

 call ABC((select tag from ads_info));

然后您可以使用此:

Select * from ads B where exists
(select * from my_temp_table where 
find_in_set(UPPER(trim(temp_columns)), replace(UPPER(B.TITLE), ' ', ',')) > 0 );

或者这个:

SELECT * FROM ads, my_temp_table
WHERE find_in_set(UPPER(trim(temp_columns)), replace(UPPER(ads.TITLE), ' ', ',')) > 0 ;