سؤال

ولدي التعداد: ENUM( 'alpha', 'beta', 'gamma', 'delta', 'omega' )

إذا كنت فرز مائدتي بحسب هذا الحقل أحصل عليها بالترتيب الصحيح المحدد أعلاه.

ولكن، لا أستطيع أن أجد وسيلة لتحديد مجموعة فرعية من هذه، على سبيل المثال كل شيء قبل الدلتا. باستخدام WHERE status < 'delta' يعود فقط ألفا وبيتا، وليس غاما. يبدو الخلية يستخدم مقارنة سلسلة، وليس مقارنة مؤشر التعداد.

وأنا يمكن استخدام الأرقام القياسية - أي 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

وإيزي!

ويمكنك استخدام FIELD(column, "string1", "string2", ...) ل تجد الصفوف مع أي مجموعة فرعية معينة من القيم ENUM الممكنة.

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

إذا كنت تريد استخدام النسخة المدى، يمكنك استخدام <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set" يختلط = "نوفولو noreferrer"> 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