Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

FIND_IN_SET () so với IN ()

SELECT  name
FROM    orders,company
WHERE   orderID = 1
        AND companyID IN (attachedCompanyIDs)

attachedCompanyIDs là một giá trị vô hướng được truyền vào INT (loại companyID ).

Phép ép kiểu chỉ trả về các số có tối đa không phải chữ số đầu tiên (trong trường hợp của bạn là dấu phẩy).

Vì vậy,

companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)

Trong PostgreSQL , bạn có thể ép chuỗi thành mảng (hoặc lưu trữ nó dưới dạng một mảng ngay từ đầu):

SELECT  name
FROM    orders
JOIN    company
ON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE   orderID = 1

và điều này thậm chí sẽ sử dụng một chỉ mục trên companyID .

Rất tiếc, điều này không hoạt động trong MySQL vì sau này không hỗ trợ mảng.

Bạn có thể thấy bài viết này thú vị (xem #2 ):

Cập nhật:

Nếu có một số giới hạn hợp lý về số lượng giá trị trong danh sách được phân tách bằng dấu phẩy (giả sử, không quá 5 ), vì vậy bạn có thể thử sử dụng truy vấn này:

SELECT  name
FROM    orders
CROSS JOIN
        (
        SELECT  1 AS pos
        UNION ALL
        SELECT  2 AS pos
        UNION ALL
        SELECT  3 AS pos
        UNION ALL
        SELECT  4 AS pos
        UNION ALL
        SELECT  5 AS pos
        ) q
JOIN    company
ON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. FROM_UNIXTIME () Ví dụ - MySQL

  2. Cách tính tiền ký quỹ trong MySQL

  3. Xóa các hàng trùng lặp trong MySQL (Bỏ qua khóa chính)

  4. Làm cách nào để cung cấp cho mỗi người dùng đã đăng ký url của riêng họ bằng PHP?

  5. Nhập giới hạn kích thước tệp trong PHPMyAdmin