Mysql
 sql >> Baza danych >  >> RDS >> Mysql

sql łączyć tabele, w których 1 kolumna ma przecinek

Powinieneś naprawdę spojrzeć na Normalizacja bazy danych i najpierw znormalizuj swoją strukturę, dodając tabelę skrzyżowań i przechowując relację z tablec każda relacja przechowywana w tablec będzie przechowywana w nowej tabeli skrzyżowań, ale nie jako lista oddzielona przecinkami, każdy wiersz będzie zawierał identyfikator c i jeden identyfikator użytkownika na wiersz, jeśli nie możesz zmienić schematu, możesz użyć find_in_set znaleźć wartości w zestawie

select *  
from  tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"

Zobacz demo

Edytuj, aby znormalizować schemat

Usunąłem userids kolumna z Twojego tblC zamiast tego utworzyłem nową tabelę połączeń jako tblC_user z 2 kolumnami c_id będzie to powiązane z kolumną identyfikatora tblC a drugi userid do przechowywania użytkowników relacji z użytkownikami dla tblC zobacz przykładowy schemat dla tblC

CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
nname varchar(255),
 PRIMARY KEY (id)
);

INSERT INTO tblC (id, nname) VALUES
('1', 'new1'),
('2', 'new2'),
('3', 'new3'),
('4', 'new4'),
('5', 'new5');

A oto twoja tabela połączeń jako tblC_user

CREATE TABLE if not exists tblC_user
(
 c_id int,
 userid int
);

INSERT INTO tblC_user (c_id,userid) VALUES
('1','1'),
('1','2'),
('2','1'),
('2','3'),
('3','1'),
('3','4'),
('4','3'),
('4','2'),
('5','5'),
('5','2');

Powyżej, jeśli zauważysz, że nie zachowałem żadnych relacji oddzielonych przecinkami, każda relacja użytkownika dla tblC jest przechowywany w nowym wierszu, dla ciebie, którego dotyczy zestaw wyników, użyłem tabeli połączeń w łączeniu, a nowe zapytanie będzie takie jak poniżej

select *  
from  tblC c
join tblC_user cu on(c.id = cu.c_id)
join tblB b on (b.userid = cu.userid)
where c.nname="new1"

Demo 2

Teraz powyższe zapytanie można zoptymalizować za pomocą indeksów, dzięki czemu można łatwo utrzymywać kaskadowe relacje




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO i MySQL UPDATE w pętli Foreach

  2. Różnica dat w MySQL do obliczania wieku

  3. Tydzień roku dla tygodni zaczynających się od soboty

  4. Jak uzyskać rozmiar bazy mysql?

  5. Wykonywanie obliczeń w MySQL vs PHP