2015-03-31 2 views
0

Я попробовал этот запрос, чтобы получить следующие данныеGROUP_CONCAT не работает в подзапрос

SELECT 
    GROUP_CONCAT(sb.p_id) , 
    TRUNCATE(SUM(sb.total_amount) , 2) grand_total, 
    TRUNCATE(SUM(sb.amount_wot) , 2) sale_amount, 
    (SELECT TRUNCATE(SUM((item_qty * item_price) * tax_price /100) , 2) 
     FROM ci_bill_items 
     WHERE bill_id IN (GROUP_CONCAT(sb.p_id))) tax_amount 
FROM ci_suppliers_bills sb 
    WHERE sb.p_id >0 

Я получил ожидаемый результат, но не tax_amount его возвращение null, но если я запустить отдельный запрос типа:

SELECT TRUNCATE(SUM((item_qty * item_price) * tax_price /100) , 2) 
    FROM ci_bill_items 
    WHERE bill_id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 71) 

Затем я получаю правильный результат. Но все, что я хочу в одном запросе, как первый, group_concat не работает, как я пытался bill_id IN (GROUP_CONCAT(sb.p_id))? Помощь очень много.

+1

'GROUP_CONCAT' возвращает строку, а не список. – Barmar

+0

@Barmar да, но он должен работать в 'bill_id IN()' это условие? Пожалуйста, сделайте меня правильным, если я ошибаюсь. –

ответ

1

Вы можете использовать FIND_IN_SET так:

SELECT 
    GROUP_CONCAT(sb.p_id) , 
    TRUNCATE(SUM(sb.total_amount) , 2) grand_total, 
    TRUNCATE(SUM(sb.amount_wot) , 2) sale_amount, 
    (SELECT TRUNCATE(SUM((item_qty * item_price) * tax_price /100) , 2) 
     FROM ci_bill_items 
     WHERE FIND_IN_SET(bill_id, GROUP_CONCAT(sb.p_id)) > 0) tax_amount 
FROM ci_suppliers_bills sb 
    WHERE sb.p_id >0 
+0

Да, это тоже работает, спасибо. –

1

GROUP_CONCAT не возвращает список, он возвращает строку. Для того, чтобы получить список, который вы можете использовать с IN, вам нужно запустить подзапрос:

WHERE bill_id IN (SELECT p_id FROM ci_suppliers_bills 
        WHERE p_id > 0) 
+0

Большое вам спасибо. –

+0

Но строка будет разделена запятой, поэтому мы можем использовать ее в виде списка? – Beginner

+0

Нет, вы не можете. Список с разделителями-запятыми работает только тогда, когда это буквальный код SQL. Выражения не превращаются в код. – Barmar

Смежные вопросы