aynı şekilde mysql iki tablodan verileri bulmak

2 Cevap php

i have two tables in my database one is A other one is B A is having few fields in which three are id,name,group B is having feilds like id,title,description, etc.

i tablo A'nın adı veya grup benzer verilere sahip olan başlık ve açıklama id aramak zorunda ve daha sonra masa A. bir alanda id eklemek zorunda

For example, if A is having 'Anna' in its name and 'girl' in its group then i have to search the title's and descriptions in table B that are containing this word 'Anna' or 'girl'.

Ben tek bir sorguda bunu yapmak istiyor.

Ben bu yüzden nasıl yapabilirim?

Edit: Iam explainng my tables here for a better understanding

 table A

id     name     group     matched_id
1       anna     girl
2       sydney   girl
3        max      boy                             etc.

Table B

id      title                                      description
1       A good girl                             Anna is a very good girl
2      Max doesnt work hard                    Boys are always like that only

vs ..

see i will first search for a match for 'anna' in the table B's title and description and if a match is found in either of them then i'll store that id in table A only in the field 'matched id' I'll do the same procedure for 'girl' and then for 'sydney' and so on

2 Cevap

Bu sorgu hile yapmak gerekir:

UPDATE a SET matched_id =
 (SELECT b.id FROM b
  WHERE b.title LIKE CONCAT(' % ',a.name,' % ')
  OR b.description LIKE CONCAT('% ',a.name,' %')
  OR b.title LIKE CONCAT('%',a.group,'%')
  OR b.description LIKE CONCAT('%',a.group,'%')
  LIMIT 1)
WHERE EXISTS
 (SELECT a.id FROM b
  WHERE b.title LIKE CONCAT('% ',a.name,' %')
  OR b.description LIKE CONCAT('% ',a.name,' %')
  OR b.title LIKE CONCAT('%',a.group,'%')
  OR b.description LIKE CONCAT('%',a.group,'%')
  LIMIT 1)

Bu bazı notlar:

  • Her sorgu ve 1 den fazla satır döndürür gibi LİMİT 1, gerekli
  • Eğer / ihtiyaç istediğiniz düzen kullanılır ise, bunun için biraz daha fazla test edilmesi gerekiyor ve gerekirse tarafindan kullanabilirsiniz% 100 emin değil
  • o da B'den A'ya tüm sonuçları harita böylece, gruplar (yinelenen girdileri azaltmak için) ve belki bir ekstra eşleme tablo için ekstra bir tablo kullanmak daha iyi olabilir

EDIT: if names need to match perfectly (unlike girl/girls), you can just add a space in front of the name: '% ',a.name,' %'. If it gets more complicated I would suggest using regular expressions (REGEX). I modified the query with the spaces (for names only), so feel free to try it again.

SELECT  *
FROM    A
JOIN    B
ON      b.title IN (a.name, a.group)
        OR b.description IN (a.name, a.group)
WHERE   a.name = 'Anna'
        AND a.group = 'girl'

INDEX_UNION 's çok verimli olmadığından MySQL, bu sorguları bölmek için daha iyi olabilir (özellikle eğer tablolardır InnoDB):

SELECT  *
FROM    (
        SELECT  b.id
        FROM    A
        JOIN    B
        ON      b.title IN (a.name, a.group)
        WHERE   a.name = 'Anna'
                AND a.group = 'girl'
        UNION
        SELECT  b.id
        FROM    A
        JOIN    B
        ON      b.description IN (a.name, a.group)
        WHERE   a.name = 'Anna'
                AND a.group = 'girl'
        ) bo
JOIN    B
ON      b.id = bo.id