Hướng dẫn mysql join only if exists - mysql tham gia chỉ nếu tồn tại

Không có điều khoản

SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
1, MySQL (cho phép đây sẽ là lỗi trong các RDBM khác) đang áp dụng nhóm tổng hợp trên tất cả các hàng trong
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
2 khi nó được nhóm chúng. Thêm
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
3

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        COUNT(b.id) tickets_bought 
FROM current_lotteries a
   JOIN lottery_tickets b ON b.lid=a.id
WHERE a.cid=1 
GROUP BY a.id
ORDER BY started DESC LIMIT 1    

Trên đây sẽ hoạt động trong MySQL nhưng không phải ở nơi khác. Phiên bản di động hơn sử dụng trình duyệt con tương quan:

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1

+----+-----------+-----------+-------------+----------+
| id | value_id  | parent_id | dropdown_id | name     |
+----+-----------+-----------+-------------+----------+
|  7 | 14945     |  14944    |         57  |4000      |
|  8 | 14944     |  0        |         56  |bbb       |
|  9 | 14943     |  14940    |         59  |comprable |
| 10 | 14942     |  14939    |         59  |comprable |
| 11 | 14940     |  14931    |         58  |3         |
| 12 | 14939     |  14930    |         58  |2         |
| 13 | 14931     |  14929    |         57  |5000      |
| 14 | 14930     |  14928    |         57  |4000      |
| 15 | 14929     |  0        |         56  |rrr       |
| 16 | 14928     |  0        |         56  |ttt       |
+----+-----------+-----------+-------------+----------+

Giải thích ưu tiên tương tự cũng áp dụng cho các câu lệnh trộn toán tử dấu phẩy với

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
9,
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
4,
SELECT t1.name, t2.salary
  FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
  FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
4 và
SELECT t1.name, t2.salary
  FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
  FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
2, tất cả đều có ưu tiên cao hơn toán tử dấu phẩy.

SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )

Phần mở rộng MySQL so với tiêu chuẩn SQL: 2003 là MySQL cho phép bạn đủ điều kiện các cột chung (kết hợp) của

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1
03 hoặc
SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
4 tham gia, trong khi tiêu chuẩn không cho phép điều đó.

Tôi có bảng trên với dữ liệu. Tôi sử dụng truy vấn dưới đây để lấy dữ liệu từ bảng.

Giống như với truy vấn ở trên, tôi nhận được chi tiết như

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+

Ở đây tôi muốn nhận được bên dưới bảng

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+

Ở đây trong hàng cuối cùng, tôi không có sẵn bảng

SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
7 và
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
8. Tôi cũng muốn bao gồm dữ liệu đó với giá trị
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
9.

Bất kỳ sự giúp đỡ được đánh giá cao.

Giải thích ưu tiên tương tự cũng áp dụng cho các câu lệnh trộn toán tử dấu phẩy với
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
9,
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
4,
SELECT t1.name, t2.salary
  FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
  FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
4 và
SELECT t1.name, t2.salary
  FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
  FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
2, tất cả đều có ưu tiên cao hơn toán tử dấu phẩy.

Phần mở rộng MySQL so với tiêu chuẩn SQL: 2003 là MySQL cho phép bạn đủ điều kiện các cột chung (kết hợp) của

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1
03 hoặc
SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
4 tham gia, trong khi tiêu chuẩn không cho phép điều đó.

table_references:
    escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference: {
    table_reference
  | { OJ table_reference }
}

table_reference: {
    table_factor
  | joined_table
}

table_factor: {
    tbl_name [PARTITION (partition_names)]
        [[AS] alias] [index_hint_list]
  | [LATERAL] table_subquery [AS] alias [(col_list)]
  | ( table_references )
}

joined_table: {
    table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

join_specification: {
    ON search_condition
  | USING (join_column_list)
}

join_column_list:
    column_name [, column_name] ...

index_hint_list:
    index_hint [, index_hint] ...

index_hint: {
    USE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | {IGNORE|FORCE} {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
}

index_list:
    index_name [, index_name] ...

13.2.10.2 & nbsp; tham gia mệnh đề

MySQL hỗ trợ cú pháp

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
0 sau đây cho phần
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
1 của các câu lệnh
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
2 và các câu lệnh
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
3 và
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
4:

Một tham chiếu bảng còn được gọi là một biểu thức tham gia.

Một tham chiếu bảng (khi nó đề cập đến một bảng được phân vùng) có thể chứa một mệnh đề

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
5, bao gồm danh sách các phân vùng được phân tách bằng dấu phẩy, các phần phụ hoặc cả hai. Tùy chọn này theo tên của bảng và đi trước mọi khai báo bí danh. Hiệu quả của tùy chọn này là các hàng chỉ được chọn từ các phân vùng được liệt kê hoặc các phần phụ. Bất kỳ phân vùng hoặc phân vùng nào không được đặt tên trong danh sách đều bị bỏ qua. Để biết thêm thông tin và ví dụ, xem Phần & NBSP; 24.5, Lựa chọn phân vùng.

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

Cú pháp của

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
6 được mở rộng trong MySQL so với SQL tiêu chuẩn. Tiêu chuẩn chỉ chấp nhận
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
7, không phải là danh sách chúng bên trong một cặp dấu ngoặc đơn.

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

Đây là một phần mở rộng bảo thủ nếu mỗi dấu phẩy trong danh sách các mục

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
7 được coi là tương đương với một lần nối bên trong. Ví dụ:

tương đương với:

Trong MySQL,

+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
+-------+-------+-------+-----------+
0,
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
0 và
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
6 là tương đương cú pháp (chúng có thể thay thế lẫn nhau). Trong SQL tiêu chuẩn, chúng không tương đương.
SELECT `d0`.`name` AS `name0`,
       `d1`.`name` AS `name1`,
       `d2`.`name` AS `name2`,
       `d3`.`name` AS `name3`
FROM   `my_table_1` AS `d0`
       INNER JOIN `my_table_1` AS `d1`
               ON d1.parent_id = d0.value_id
       INNER JOIN `my_table_1` AS `d2`
               ON d2.parent_id = d1.value_id
       INNER JOIN `my_table_1` AS `d3`
               ON d3.parent_id = d2.value_id
WHERE  ( d0.dropdown_id = 56 )
6 được sử dụng với mệnh đề
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
3,
+-------+-------+-------+-----------+
| name0 | name1 | name2 |   name3   |
+-------+-------+-------+-----------+
| ttt   |  4000 |     2 | comprable |
| rrr   |  5000 |     3 | comprable |
| bbb   |  4000 |  NULL | NULL      |
+-------+-------+-------+-----------+
4 được sử dụng khác.

Danh sách sau đây mô tả các yếu tố chung cần tính đến khi viết tham gia:

  • Một tham chiếu bảng có thể được đặt bí danh bằng cách sử dụng

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    6 là
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    7 hoặc
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    8:

    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
  • Một

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    9 còn được gọi là một bảng dẫn xuất hoặc truy vấn con trong mệnh đề
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    0. Xem Phần & NBSP; 13.2.11.8, Bảng dẫn xuất. Các truy vấn con như vậy phải bao gồm một bí danh để đưa ra kết quả con một tên bảng và có thể tùy ý bao gồm một danh sách các tên cột bảng trong ngoặc đơn. Một ví dụ tầm thường sau:must include an alias to give the subquery result a table name, and may optionally include a list of table column names in parentheses. A trivial example follows:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    0
  • Số lượng bảng tối đa có thể được tham chiếu trong một lần tham gia là 61. Điều này bao gồm một lần tham gia được xử lý bằng cách hợp nhất các bảng và chế độ xem trong mệnh đề

    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    0 vào khối truy vấn bên ngoài (xem Phần & NBSP; 8.2.2.2 Tài liệu tham khảo và biểu thức bảng phổ biến với sự hợp nhất hoặc vật chất hóa).

  • SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    6 và
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    3 (dấu phẩy) tương đương về mặt ngữ nghĩa khi không có điều kiện tham gia: cả hai sản xuất một sản phẩm Cartesian giữa các bảng được chỉ định (nghĩa là mỗi và mỗi hàng trong bảng đầu tiên được nối với từng hàng trong bảng thứ hai) .

    Tuy nhiên, mức độ ưu tiên của toán tử dấu phẩy ít hơn so với

    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    6,
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    5,
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    6, v.v. Nếu bạn kết hợp dấu phẩy tham gia với các loại tham gia khác khi có điều kiện tham gia, có thể xảy ra lỗi của mẫu
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    7 'trong mệnh đề' trên mệnh đề '. Thông tin về xử lý vấn đề này được đưa ra sau trong phần này.

  • table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    8 được sử dụng với
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 là bất kỳ biểu thức có điều kiện nào của hình thức có thể được sử dụng trong mệnh đề
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    0. Nói chung, mệnh đề
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 phục vụ cho các điều kiện chỉ định cách tham gia các bảng và mệnh đề
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    0 hạn chế các hàng sẽ bao gồm trong tập kết quả.

  • Nếu không có hàng phù hợp cho bảng phù hợp trong phần

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 hoặc
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 trong
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    6, một hàng với tất cả các cột được đặt thành
    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    9 được sử dụng cho bảng bên phải. Bạn có thể sử dụng thực tế này để tìm các hàng trong một bảng không có đối tác trong một bảng khác:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    1

    Ví dụ này tìm thấy tất cả các hàng trong

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    7 với giá trị
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    8 không có trong
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    9 (nghĩa là tất cả các hàng trong
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    7 không có hàng tương ứng trong
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    9). Xem Phần & NBSP; 8.2.1.9, Tối ưu hóa tham gia bên ngoài.

  • Điều khoản

    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    2) đặt tên cho một danh sách các cột phải tồn tại trong cả hai bảng. Nếu các bảng
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    3 và
    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    2, cả hai đều chứa các cột
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    5,
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    6 và
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    7, các tham gia sau đây sẽ so sánh các cột tương ứng với hai bảng:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    2
  • SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    8 của hai bảng được xác định là tương đương về mặt ngữ nghĩa với
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    9 hoặc
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    6 với mệnh đề
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 đặt tên cho tất cả các cột tồn tại trong cả hai bảng.

  • SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    2 hoạt động tương tự như
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    6. Để giữ mã di động trên cơ sở dữ liệu, bạn nên sử dụng
    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    4 thay vì
    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    2.

  • Cú pháp

    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    6 được hiển thị trong mô tả cú pháp tham gia chỉ tồn tại để tương thích với ODBC. Các niềng răng xoăn trong cú pháp nên được viết theo nghĩa đen; Chúng không phải là metasyntax như được sử dụng ở nơi khác trong các mô tả cú pháp.

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    3

    Bạn có thể sử dụng các loại nối khác trong

    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    7, chẳng hạn như
    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    6 hoặc
    SELECT t1.name, t2.salary
      FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
    
    SELECT t1.name, t2.salary
      FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;
    9. Điều này giúp tương thích với một số ứng dụng của bên thứ ba, nhưng không phải là cú pháp ODBC chính thức.

  • SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    00 tương tự như
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    +-------+-------+-------+-----------+
    
    0, ngoại trừ bảng bên trái luôn được đọc trước bảng bên phải. Điều này có thể được sử dụng cho những trường hợp (một vài) trường hợp mà trình tối ưu hóa tham gia xử lý các bảng theo thứ tự dưới mức tối ưu.

Một số ví dụ tham gia:

SELECT  a.id,
        a.name,
        a.n,
        a.r,
        a.pot,
        a.ticket_price,
        a.starting_tickets,
        a.started,
        a.end,
        b.tickets_bought
FROM current_lotteries a
        /* More portable to join against a subquery which returns the count per group */
        JOIN (
            SELECT b.lid, COUNT(*) AS tickets_bought 
            FROM lottery_tickets 
            GROUP BY lid
        ) b ON a.id = b.lid
WHERE a.cid = 1
ORDER BY started DESC LIMIT 1
4

Các kết nối tự nhiên và tham gia với

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
4, bao gồm các biến thể tham gia bên ngoài, được xử lý theo tiêu chuẩn SQL: 2003:

  • Các cột dự phòng của

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    03 Tham gia không xuất hiện. Hãy xem xét tập hợp các tuyên bố này:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    5

    Trong câu lệnh

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    +-------+-------+-------+-----------+
    
    2 đầu tiên, cột
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    05 xuất hiện trong cả hai bảng và do đó trở thành cột nối, do đó, theo SQL tiêu chuẩn, nó chỉ xuất hiện một lần trong đầu ra, không hai lần. Tương tự, trong câu lệnh SELECT thứ hai, cột
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    05 được đặt tên trong mệnh đề
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 và chỉ xuất hiện một lần trong đầu ra, không phải hai lần.

    Do đó, các câu lệnh tạo ra đầu ra này:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    6

    Việc loại bỏ cột dự phòng và thứ tự cột xảy ra theo SQL tiêu chuẩn, tạo ra thứ tự hiển thị này:

    • Đầu tiên, kết hợp các cột chung của hai bảng được nối, theo thứ tự chúng xảy ra trong bảng đầu tiên

    • Thứ hai, các cột duy nhất cho bảng đầu tiên, theo thứ tự chúng xảy ra trong bảng đó

    • Thứ ba, các cột duy nhất cho bảng thứ hai, theo thứ tự chúng xảy ra trong bảng đó

    Cột kết quả duy nhất thay thế hai cột phổ biến được xác định bằng cách sử dụng hoạt động hợp tác. Đó là, trong hai

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    08 và
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    09 Cột nối đơn kết quả
    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    3 được định nghĩa là
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    11, trong đó:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    7

    Nếu thao tác tham gia là bất kỳ tham gia nào khác, các cột kết quả của nối bao gồm sự kết hợp của tất cả các cột của các bảng được nối.

    Hậu quả của định nghĩa của các cột kết hợp là, đối với các kết nối bên ngoài, cột kết hợp chứa giá trị của cột không phải -____ 39 nếu một trong hai cột luôn luôn là

    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    9. Nếu cả hoặc cả hai cột đều không phải là
    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    9, cả hai cột phổ biến đều có cùng giá trị, do đó, không quan trọng là giá trị nào là giá trị của cột kết hợp. Một cách đơn giản để giải thích điều này là xem xét rằng một cột kết hợp của một lần nối bên ngoài được biểu thị bằng cột chung của bảng bên trong của
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    +-------+-------+-------+-----------+
    
    0. Giả sử rằng các bảng
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    16 và
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    17 có nội dung sau:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    8

    Sau đó, đối với tham gia này, cột

    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    3 chứa các giá trị của
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    08:

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    9

    Ngược lại, đối với tham gia này, cột

    SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    3 chứa các giá trị của
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    09.

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    0

    So sánh các kết quả đó với các truy vấn tương đương khác với

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    22:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    1
    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    2
  • Một mệnh đề

    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 có thể được viết lại dưới dạng mệnh đề
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 so sánh các cột tương ứng. Tuy nhiên, mặc dù
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 và
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 là tương tự nhau, nhưng chúng không hoàn toàn giống nhau. Hãy xem xét hai truy vấn sau:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    3

    Đối với việc xác định các hàng nào thỏa mãn điều kiện tham gia, cả hai tham gia đều giống hệt nhau về mặt ngữ nghĩa.

    Đối với việc xác định cột nào sẽ hiển thị cho việc mở rộng

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    27, hai lần tham gia không giống nhau về mặt ngữ nghĩa. Tham gia
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4 chọn giá trị kết hợp của các cột tương ứng, trong khi
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 tham gia chọn tất cả các cột từ tất cả các bảng. Đối với tham gia
    SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                     ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)
    4,
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    27 chọn các giá trị này:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    4

    Đối với tham gia

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3,
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    33 chọn các giá trị này:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    5

    Với tham gia bên trong,

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    34 giống như
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    35 hoặc
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    36 vì cả hai cột đều có cùng giá trị. Với một tham gia bên ngoài (chẳng hạn như
    table_references:
        escaped_table_reference [, escaped_table_reference] ...
    
    escaped_table_reference: {
        table_reference
      | { OJ table_reference }
    }
    
    table_reference: {
        table_factor
      | joined_table
    }
    
    table_factor: {
        tbl_name [PARTITION (partition_names)]
            [[AS] alias] [index_hint_list]
      | [LATERAL] table_subquery [AS] alias [(col_list)]
      | ( table_references )
    }
    
    joined_table: {
        table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
      | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
    }
    
    join_specification: {
        ON search_condition
      | USING (join_column_list)
    }
    
    join_column_list:
        column_name [, column_name] ...
    
    index_hint_list:
        index_hint [, index_hint] ...
    
    index_hint: {
        USE {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
      | {IGNORE|FORCE} {INDEX|KEY}
          [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
    }
    
    index_list:
        index_name [, index_name] ...
    6), một trong hai cột có thể là
    SELECT `d0`.`name` AS `name0`,
           `d1`.`name` AS `name1`,
           `d2`.`name` AS `name2`,
           `d3`.`name` AS `name3`
    FROM   `my_table_1` AS `d0`
           INNER JOIN `my_table_1` AS `d1`
                   ON d1.parent_id = d0.value_id
           INNER JOIN `my_table_1` AS `d2`
                   ON d2.parent_id = d1.value_id
           INNER JOIN `my_table_1` AS `d3`
                   ON d3.parent_id = d2.value_id
    WHERE  ( d0.dropdown_id = 56 )
    
    9. Cột đó bị bỏ qua từ kết quả.

  • Một mệnh đề

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 chỉ có thể đề cập đến các toán hạng của nó.

    Thí dụ:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    6

    Câu lệnh không thành công với lỗi

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    40 vì
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    41 là một cột trong
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    42, đây không phải là toán hạng của mệnh đề
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3. Để cho phép kết nối được xử lý, hãy viết lại câu lệnh như sau:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    7
  • ‘ Điều này ảnh hưởng đến các câu lệnh sử dụng mệnh đề

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 vì điều khoản đó chỉ có thể đề cập đến các cột trong các toán hạng của tham gia và mức độ ưu tiên ảnh hưởng đến việc giải thích các toán hạng đó là gì.

    Thí dụ:

    +----+-----------+-----------+-------------+----------+
    | id | value_id  | parent_id | dropdown_id | name     |
    +----+-----------+-----------+-------------+----------+
    |  7 | 14945     |  14944    |         57  |4000      |
    |  8 | 14944     |  0        |         56  |bbb       |
    |  9 | 14943     |  14940    |         59  |comprable |
    | 10 | 14942     |  14939    |         59  |comprable |
    | 11 | 14940     |  14931    |         58  |3         |
    | 12 | 14939     |  14930    |         58  |2         |
    | 13 | 14931     |  14929    |         57  |5000      |
    | 14 | 14930     |  14928    |         57  |4000      |
    | 15 | 14929     |  0        |         56  |rrr       |
    | 16 | 14928     |  0        |         56  |ttt       |
    +----+-----------+-----------+-------------+----------+
    
    8

    Câu lệnh không thành công với lỗi

    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    40 vì
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    41 là một cột trong
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    42, đây không phải là toán hạng của mệnh đề
    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3. Để cho phép kết nối được xử lý, hãy viết lại câu lệnh như sau:

    ‘ Điều này ảnh hưởng đến các câu lệnh sử dụng mệnh đề

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 vì điều khoản đó chỉ có thể đề cập đến các cột trong các toán hạng của tham gia và mức độ ưu tiên ảnh hưởng đến việc giải thích các toán hạng đó là gì.

    • +-------+-------+-------+-----------+
      | name0 | name1 | name2 |   name3   |
      +-------+-------+-------+-----------+
      | ttt   |  4000 |     2 | comprable |
      | rrr   |  5000 |     3 | comprable |
      +-------+-------+-------+-----------+
      
      0 được ưu tiên hơn nhà điều hành dấu phẩy, do đó, các toán hạng cho mệnh đề
      +-------+-------+-------+-----------+
      | name0 | name1 | name2 |   name3   |
      +-------+-------+-------+-----------+
      | ttt   |  4000 |     2 | comprable |
      | rrr   |  5000 |     3 | comprable |
      | bbb   |  4000 |  NULL | NULL      |
      +-------+-------+-------+-----------+
      
      3 là
      SELECT  a.id,
              a.name,
              a.n,
              a.r,
              a.pot,
              a.ticket_price,
              a.starting_tickets,
              a.started,
              a.end,
              b.tickets_bought
      FROM current_lotteries a
              /* More portable to join against a subquery which returns the count per group */
              JOIN (
                  SELECT b.lid, COUNT(*) AS tickets_bought 
                  FROM lottery_tickets 
                  GROUP BY lid
              ) b ON a.id = b.lid
      WHERE a.cid = 1
      ORDER BY started DESC LIMIT 1
      
      52 và
      SELECT  a.id,
              a.name,
              a.n,
              a.r,
              a.pot,
              a.ticket_price,
              a.starting_tickets,
              a.started,
              a.end,
              b.tickets_bought
      FROM current_lotteries a
              /* More portable to join against a subquery which returns the count per group */
              JOIN (
                  SELECT b.lid, COUNT(*) AS tickets_bought 
                  FROM lottery_tickets 
                  GROUP BY lid
              ) b ON a.id = b.lid
      WHERE a.cid = 1
      ORDER BY started DESC LIMIT 1
      
      42. Vì
      SELECT  a.id,
              a.name,
              a.n,
              a.r,
              a.pot,
              a.ticket_price,
              a.starting_tickets,
              a.started,
              a.end,
              b.tickets_bought
      FROM current_lotteries a
              /* More portable to join against a subquery which returns the count per group */
              JOIN (
                  SELECT b.lid, COUNT(*) AS tickets_bought 
                  FROM lottery_tickets 
                  GROUP BY lid
              ) b ON a.id = b.lid
      WHERE a.cid = 1
      ORDER BY started DESC LIMIT 1
      
      54 không phải là một cột trong một trong hai toán hạng, kết quả là lỗi
      SELECT  a.id,
              a.name,
              a.n,
              a.r,
              a.pot,
              a.ticket_price,
              a.starting_tickets,
              a.started,
              a.end,
              b.tickets_bought
      FROM current_lotteries a
              /* More portable to join against a subquery which returns the count per group */
              JOIN (
                  SELECT b.lid, COUNT(*) AS tickets_bought 
                  FROM lottery_tickets 
                  GROUP BY lid
              ) b ON a.id = b.lid
      WHERE a.cid = 1
      ORDER BY started DESC LIMIT 1
      
      55.

      +----+-----------+-----------+-------------+----------+
      | id | value_id  | parent_id | dropdown_id | name     |
      +----+-----------+-----------+-------------+----------+
      |  7 | 14945     |  14944    |         57  |4000      |
      |  8 | 14944     |  0        |         56  |bbb       |
      |  9 | 14943     |  14940    |         59  |comprable |
      | 10 | 14942     |  14939    |         59  |comprable |
      | 11 | 14940     |  14931    |         58  |3         |
      | 12 | 14939     |  14930    |         58  |2         |
      | 13 | 14931     |  14929    |         57  |5000      |
      | 14 | 14930     |  14928    |         57  |4000      |
      | 15 | 14929     |  0        |         56  |rrr       |
      | 16 | 14928     |  0        |         56  |ttt       |
      +----+-----------+-----------+-------------+----------+
      
      9
    • Để cho phép kết nối được xử lý, hãy sử dụng một trong những chiến lược này:

      SELECT `d0`.`name` AS `name0`,
             `d1`.`name` AS `name1`,
             `d2`.`name` AS `name2`,
             `d3`.`name` AS `name3`
      FROM   `my_table_1` AS `d0`
             INNER JOIN `my_table_1` AS `d1`
                     ON d1.parent_id = d0.value_id
             INNER JOIN `my_table_1` AS `d2`
                     ON d2.parent_id = d1.value_id
             INNER JOIN `my_table_1` AS `d3`
                     ON d3.parent_id = d2.value_id
      WHERE  ( d0.dropdown_id = 56 )
      
      0

    Nhóm hai bảng đầu tiên một cách rõ ràng với dấu ngoặc đơn để các toán hạng cho mệnh đề

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    | bbb   |  4000 |  NULL | NULL      |
    +-------+-------+-------+-----------+
    
    3 là
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    57 và
    SELECT  a.id,
            a.name,
            a.n,
            a.r,
            a.pot,
            a.ticket_price,
            a.starting_tickets,
            a.started,
            a.end,
            b.tickets_bought
    FROM current_lotteries a
            /* More portable to join against a subquery which returns the count per group */
            JOIN (
                SELECT b.lid, COUNT(*) AS tickets_bought 
                FROM lottery_tickets 
                GROUP BY lid
            ) b ON a.id = b.lid
    WHERE a.cid = 1
    ORDER BY started DESC LIMIT 1
    
    42:

  • Thay vào đó, tránh việc sử dụng toán tử dấu phẩy và sử dụng

    +-------+-------+-------+-----------+
    | name0 | name1 | name2 |   name3   |
    +-------+-------+-------+-----------+
    | ttt   |  4000 |     2 | comprable |
    | rrr   |  5000 |     3 | comprable |
    +-------+-------+-------+-----------+
    
    0: