簡體   English   中英

TYPO3 selectMultipleSideBySide數據庫查詢

[英]TYPO3 selectMultipleSideBySide database query

嗨,TYPO3 我有以下代碼

三氯乙酸:

'cat' => [
        'exclude' => true,
        'label' => 'LABEL',
        'config' => [
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
...

這會在表中保存一個字符串。 如果我 select 有多個選項,它會像這樣保存在表“1,2”(選定的類別 1 和 2)中。 controller 有這個代碼

Controller:

$catlist = explode(',', $categories);
    $searchForValue = ',';
    foreach ($catlist as $cat) {
        $and .= ' OR categories = ' . '"' . $cat . '"';
        if (strpos($categories, $searchForValue) !== false) {
            $where = ' WHERE categories = ' . '"' . $categories .'"' . $and;
        } else {
            $where = ' WHERE categories = ' . '"' . $categories .'"';
        }
    }

這是給我以下聲明:

SELECT * FROM TABLE WHERE categories = "2,3" OR categories = "2" OR categories = "3"

但是,如果我有一篇包含類別 2 和 1 的文章,則數據庫中存在字符串“2,1”,我的查詢將無法正常工作。 我只得到類別 3 的文章,而不是類別 2 和 1 (2,1) 的文章。 我如何生成有用的查詢?

當我遇到這種類型的問題時,我通常會使用包含所有可能情況的 where 子句執行查詢,即 4(與存儲在數據庫中的數據相關)

  • 2(2是文章的唯一分類)
  • 2、(2是文章的第一類)
  • ,2(2是文章的最后一類)
  • ,2,(2是其中的一個類別)

然后,您必須更改構建查詢的 controller,以便 WHERE 為以下形式:

WHERE categories='2' OR categories LIKE '2,%' OR categories LIKE '%,2' OR categories LIKE '%,2,%'

肯定有更好更有效的方法,讓我們看看是否有其他人響應,以便我們學習它。

顯然,這解決了針對單個類別進行搜索時的問題(我不明白您的問題是這個問題還是搜索 2 個或更多類別的問題)。 在后一種情況下你必須在where中包括所有可能的組合,這大大增加了問題的復雜性,使我的解決方案非常不合適。

但是,如果您對多個類別的搜索不是排他性的,即一篇文章有一個選定的類別(只有 2 或 3 個)就足夠了,那么您可以簡單地在 OR 中為搜索的每個類別構建 4 種組合。 這意味着對於 2 個類別,您將在 OR 中有 8 個 where 子句,對於 3 個類別,12 個,對於 N,您將有 n * 4 個 where 子句。 如前所述,你當然可以做一些性能更好的東西,但幸運的是,到目前為止我從來不需要它

編輯:感謝@GeorgRinger提供的提示。 使用 function FIND_IN_SET where 子句的構造應該是這樣的(總是如果只需要一個類別匹配)

$where = "";
foreach ($catlist as $cat) {
    if ($where!=""){
        $where = $where . " OR ";
    }
    $where = $where . " FIND_IN_SET(\"".$cat."\",categories)>0 "
}
$where = "WHERE " . $where

暫無
暫無

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

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