簡體   English   中英

如何擴展GROUP_CONCAT值?

[英]How to expand GROUP_CONCAT value?

SELECT
    `s1`.`question`,
    GROUP_CONCAT(QUOTE(`so1`.`name`)) `answers`
FROM
    `survey` `s1`
INNER JOIN
    `survey_option` `so1`
ON
    `so1`.`survey_id` = `s1`.`id`
GROUP BY
    `s1`.`id`;

該查詢將產品question列表與answer作為引號,以逗號分隔的字符串。

如何將答案字符串擴展為數組?

我想到的第一件事是explode("','", mb_substr($answers_str, 1, -1))

我應該注意任何陷阱嗎?

# Run query
SELECT
#   `s1`.`id`,
    `s1`.`question`,
    `so1`.`name`
FROM
    `survey` `s1`
INNER JOIN
    `survey_option` `so1`
ON
    `so1`.`survey_id` = `s1`.`id`

# Fetch query
$arr = array();
while($row = mysql_fetch_object($query))
    $arr[$row->question][] = $row->name;

# If question's aren't unique, you can also fetch 'id' in query and:
$arr = array();
while($row = mysql_fetch_object($query))
    $arr[$row->id][] = $row;

假設您將查詢值另存為$query 如果您打算在以后進行拆分,則沒有必要進行GROUP_CONCAT 只需使用數組及其鍵值就足夠了。

我使這個問題聽起來比實際要困難得多。 我的解決方案雖然已經解決了潛在的問題,但並未直接回答我的問題。

我需要為報告門戶生成數據導出,其中存在一組定義的變量(例如,first_name,last_name等)+隨時間變化的數據變量(即,根據其是否存在而必須包括或排除)在規定的時間間隔內)。 此外,它必須以Excel友好格式(例如csv)生成(因此首次嘗試使用逗號使用GROUP CONCATination)。

我使用的解決方案是動態查詢生成

public function getCombined/*[..]*/ (array $filter = []) {
    // Find the columns
    $freeform_data = $this->db
        ->prepare("
        SELECT
            DISTINCT `dpd1`.`name`
        FROM
            `device_product` `dp1`
        INNER JOIN
            `device_product_data` `dpd1`
        ON
            `dpd1`.`device_product_id` = `dp1`.`id`;
        ")
        ->execute([$filter)
        ->fetchAll(\PDO::FETCH_COLUMN);

    $freeform_data_selectors = '';
    $freeform_data_join = '';

    foreach ($freeform_data as $i => $name) {
        if ($name != preg_replace('/[^a-z_-]/i', '', $name)) {
            throw new \ErrorException('Invalid freeform data input name ("' . $name . '").');
        }

        $alias = '`dpd' . ($i + 1) . '`';

        $freeform_data_selectors .= ', ' . $alias . '.`value` `freeform_' . $name . '`';

        $freeform_data_join .= '
        LEFT JOIN
            `device_product_data` ' . $alias . '
        ON
            ' . $alias . '.`device_product_id` = `dp1`.`id` AND
            ' . $alias . '.`name` = \'' . $name . '\'
            ';
    }

    $stmt = $this->db
        ->prepare("
        SELECT
            `d1`.`mac_address` `device_mac_address`,            
            {$freeform_data_selectors}
        FROM
            `device_product` `dp1`          
        {$freeform_data_join}
        GROUP BY
            `dp1`.`id`;", [\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false])
        ->execute($filter);

    return stmt;
}

這是一個簡化的示例,似乎與Robin Castlin所建議的相似。 但是,實際查詢還有另外10個聯接和一個大型數據集(2M +)。 Castlin的建議將需要更多的資源來檢索數據並進行組織。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM