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

Pobieraj dane dla wielu pojedynczych lub referencyjnych bez podobnego operatora

Rozważ następujące

mysql> select * from employee ;
+------+------+--------+
| id   | name | skills |
+------+------+--------+
|    1 | xyz  | 1,2,4  |
|    2 | abc  | 1,3    |
|    3 | lmn  | 1,2,3  |
+------+------+--------+
3 rows in set (0.00 sec)

mysql> select * from skillset ;
+------+----------+
| id   | skillset |
+------+----------+
|    1 | Python   |
|    2 | Java     |
|    3 | C        |
|    4 | PHP      |
+------+----------+
4 rows in set (0.00 sec)

Ta struktura jest podobna do twojej i do wykonania zapytania w takiej sytuacji możemy jednak użyć find_in_set ale to dość nieefektywne , oto kilka przykładów

mysql> select e.id,
e.name, 
group_concat(s.skillset) as skillset 
from employee e join skillset s 
on find_in_set(s.id,e.skills) > 0 
where find_in_set(1,e.skills) > 0 
 group by e.id ;
+------+------+-----------------+
| id   | name | skillset        |
+------+------+-----------------+
|    1 | xyz  | Python,Java,PHP |
|    2 | abc  | C,Python        |
|    3 | lmn  | Java,Python,C   |
+------+------+-----------------+
3 rows in set (0.00 sec)

select e.id,
e.name, 
group_concat(s.skillset) as skillset 
from employee e 
join skillset s on find_in_set(s.id,e.skills) > 0 
where find_in_set(2,e.skills) > 0  group by e.id ;
+------+------+-----------------+
| id   | name | skillset        |
+------+------+-----------------+
|    1 | xyz  | Python,PHP,Java |
|    3 | lmn  | C,Java,Python   |
+------+------+-----------------+

Teraz prawidłowa normalizacja znacznie uprościłaby życie i miałaby następującą tabelę powiązań

mysql> select * from employee_skills; 
+------------+----------+
| idemployee | idskills |
+------------+----------+
|          1 |        1 |
|          1 |        2 |
|          1 |        3 |
|          2 |        1 |
|          2 |        3 |
|          3 |        1 |
|          3 |        2 |
|          3 |        3 |
+------------+----------+

Teraz wykonywanie zapytań będzie w tym przypadku znacznie wydajniejsze

mysql> select e.id,
e.name,
s.skillset from employee e 
join employee_skills es on es.idemployee = e.id 
join skillset s on s.id = es.idskills where s.id = 1 ;
+------+------+----------+
| id   | name | skillset |
+------+------+----------+
|    1 | xyz  | Python   |
|    2 | abc  | Python   |
|    3 | lmn  | Python   |
+------+------+----------+

Korzystając z ostatniego podejścia, bardziej złożone obliczenia można wykonać dość łatwo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica MySQL między dwoma wierszami instrukcji SELECT

  2. Gdzie mogę znaleźć plik my.ini dla serwera Windows mysql?

  3. Mysqldump więcej niż jeden stół?

  4. odpowiedź danych ajax zawsze 0 w php mysql

  5. php:jak zmienić dane ciągu na dane liczbowe