การรวบรวมด้วย FIND_IN_SET ในคุณลักษณะการเลือกหลายรายการ แต่บางรายการมีเพียงค่าเดียว


9

ฉันกำลังสร้างชุดผลิตภัณฑ์ซึ่งจะค้นหาผลลัพธ์จากแอตทริบิวต์แบบเลือกได้หลายแบบ

(รหัสที่เกี่ยวข้องที่เพิ่ม finset ให้กับคอลเลกชัน - ปรับเพื่อแสดงค่ารหัสจริง)

$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'measurement');
    $value = array('finset' => array('237',
                '236',
                '235',
                '234',
                '233',));
    $collection->addAttributeToFilter($attribute, $value);

sql ที่เป็นผลลัพธ์ (โดยเพิ่มตัวกรอง visiblity) เป็นเช่น:

SELECT DISTINCT
    e . *,
    at_measurement.value AS measurement,
    at_visibility.value AS visibility
FROM
    catalog_product_entity AS e
        INNER JOIN
    catalog_product_entity_varchar AS at_measurement ON (at_measurement.entity_id = e.entity_id) AND (at_measurement.attribute_id = '983') AND (at_measurement.store_id = 0)
        INNER JOIN
    catalog_product_entity_int AS at_visibility ON (at_visibility.entity_id = e.entity_id) AND (at_visibility.attribute_id = '526') AND (at_visibility.store_id = 0)
WHERE
    (e.attribute_set_id IN ('74')) AND (FIND_IN_SET('237',
            '236',
            '235',
            '234',
            '233',
            at_measurement.value)) AND (at_visibility.value IN ('2' , '4'))
GROUP BY e.entity_id

ปัญหาคือฉันได้รับข้อผิดพลาด sql:

"SQLSTATE[42000]: Syntax error or access violation: 1582 Incorrect parameter count in the call to native function 'FIND_IN_SET'"

และฉัน (คิดว่า) ฉันเห็นได้ว่าเหตุใด: ค่าหลายค่าบางค่ามีเพียงหนึ่งตัวเลือกเท่านั้นดังนั้นจึงไม่มีค่าที่คั่นด้วยเครื่องหมายจุลภาคเพื่อให้ได้คุณสมบัติ FINSET

ฉันถูกต้องไหมว่าทำไมข้อผิดพลาดนี้ถึงเกิดขึ้น? ฉันจะเขียนวัตถุรวบรวมนี้เพื่อบัญชีนี้ได้อย่างไร

ถ้าไม่ใช่ข้างต้นฉันจะพลาดอะไรไปบ้าง

ผลลัพธ์จากการเรียกใช้ sql ใน mysql workbench ลบด้วยคำสั่ง find_in_set:

ตรวจสอบผลลัพธ์ในตัวแก้ไขแบบสอบถาม


คำตอบ:


26

ลองใช้ addAttributeToFilter กับหรือเงื่อนไข

$collection->addAttributeToFilter($attribute,
    array(
        array('finset'=> array('237')),
        array('finset'=> array('238')),
        array('finset'=> array('239')),
    )
);

หรือ

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
        array('attribute'=> 'attributecode','finset' => array('237')),
    )
);

1
เราจะทำอย่างไรไม่ FIND_IN_SET
Slimshadddyyy

วิธีการใช้เงื่อนไข 'และ'
Deeban Babu

1
สำหรับ "AND" เพียงแค่ทำซ้ำ $ collection-> addAttributeToFilter () สำหรับแต่ละค่า
Wouter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.