Mysql
 sql >> база данни >  >> RDS >> Mysql

MySql. Как да използвате Self Join

Толкова сте близо!

Тъй като казвате, че показвате държавата и годината от A и ограничавате с A. Country на Турция, Турция е всичко, което ще видите. Трябва или да промените избора на B.country и B.year или променете клаузата where да бъде B.country .

Това използва кръстосано свързване, което ще става по-бавно, колкото повече записи има в таблицата.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

може да бъде написано като... и вероятно ще има същия план за изпълнение.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

ИЛИТова използва INNER JOIN, което ограничава работата, която двигателят трябва да извърши, и не страда от влошаване на производителността, което би могло при кръстосано свързване.

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';

ЗАЩО:

Помислете какво ще направи SQL машината, когато се случи присъединяванетоA B

+------------+------+--------+------------+------+--------+
| A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 

Така че, когато казахте показване A.Country и A.Year където A.Country е Турция, можете да видите всичко, което може да върне, е Турция (поради отделния само 1 запис)

Но ако го направите B.Country е Турция и показва A.Country , ще получите Франция, Канада и Турция!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Последователни записи с брой

  2. Топ 50 въпроса за интервю за MySQL, които трябва да подготвите през 2022 г

  3. Как мога да получа процента от общия брой редове с mysql за група?

  4. Защо не трябва да използвам mysql_* функции в PHP?

  5. Таблицата за миграция на Laravel вече съществува, но искам да добавя нова, а не по-стара