문제

나는 열거가있다 : ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )

이 열로 테이블을 정렬하면 위에서 정의 된 올바른 순서로 얻습니다.

그러나 델타 이전의 모든 것, 즉 델타 이전의 하위 집합을 선택하는 방법을 찾을 수 없습니다. 사용 WHERE status < 'delta' 감마가 아닌 알파와 베타 만 반환합니다. MySQL은 열거 된 인덱스 비교가 아니라 문자열 비교를 사용하는 것 같습니다.

인덱스 번호를 사용할 수 있습니다 - 즉 WHERE status < 4 - 그러나 그것은 약간의 코드 냄새 (마법 숫자)이며, 열거에 새 값을 삽입하면 깨질 수 있습니다.

도움이 되었습니까?

해결책

메타 데이터에서 데이터 조작 방법을 사용하려고 노력하고 있으며 이는 어색해야합니다.

이것이 바로 교체해야 할 좋은 이유입니다 ENUM 조회 테이블에 대한 외국 키가 있습니다. 그런 다음 기존 데이터 조작 기술을 사용할 수 있습니다.

다른 팁

당신이 사용할 수있는 status+0 1부터 시작하여 열거의 색인을 반환합니다.

나타내다 http://serghei.net/docs/database/mysql/doc/e/n/enum.html

방금 같은 문제를 발견했습니다. 열거 필드를 정렬하려면 먼저 문자열 유형으로 캐스팅해야합니다 (범주는 예에서 내 열거 필드입니다) :

SELECT
CONVERT(category USING utf8) as str_category 
FROM
example
GROUP BY
str_category
ORDER BY 
str_category

eazy!

당신이 사용할 수있는 FIELD(column, "string1", "string2", ...) 가능한 특정 하위 집합이있는 행을 찾습니다 ENUM 가치.

SELECT * FROM `table` WHERE FIELD(`enum_column`, "alpha", "delta", "et cetera");

범위 버전을 사용하려면 사용할 수 있습니다. FIND_IN_SET("needle", "hay,stack") 인덱스를 반환하려면 다른 쿼리와 함께 먼저 테이블 정의에서 열거 목록을 추출해야합니다.

함수 만들기 :

CREATE fEnumIndex(_table VARCHAR(50), _col VARCHAR(50), _val VARCHAR(50))
RETURNS INT DETERMINISTIC
BEGIN
    DECLARE _lst VARCHAR(8192);
    DECLARE _ndx INT;

    SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','')
    FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND
    TABLE_NAME=_table AND COLUMN_NAME=_col INTO _lst;
    SET _ndx = FIND_IN_SET(_val, _lst);
    RETURN _ndx;
END

그런 다음 다음과 같이 쿼리에서 사용하십시오.

SELECT * FROM MyTable WHERE Status < fEnumIndex('MyTable','Status','delta') ;

그만큼 SELECT REPLACE(REPLACE(REPLACE(COLUMN_TYPE,''', ''',','),'enum(',''),')','') 그것을 취할 것입니다 COLUMN_TYPE ~와 같은 ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' ) 쉼표로 구분 된 목록으로 바꾸십시오. 'alpha, beta, gamma, delta, omega'. 그럼 FIND_IN_SET(_val, _lst) 인덱스를 가져옵니다.

조심해야 할 유일한 것은 열거를 정의하는 방법 (항목 사이의 공간이 있거나없는)과 내부에서 REPLACE (From_string의 공간이 있거나없는).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top