0

'menu_item_id' = 1を含む't'(スレッド)からすべてのアイテムを返す必要があります。

さらに、f.tagに基づいて上記のすべての結果をフィルタリングする必要があります。

SELECT t.*, u.username AS owner, uu.username AS replyname, a.location
FROM thread t
INNER JOIN filter_thread as ft ON t.thread_id = ft.thread_id
INNER JOIN filter as f ON f.filter_id = ft.filter_id
INNER JOIN users u ON t.owner_id = u.id 
INNER JOIN users uu ON t.last_post_id = uu.id
INNER JOIN user_profiles AS up ON u.id = up.user_id
INNER JOIN avatars AS a ON up.avatar_id = a.id
WHERE t.menu_item_id='1'
AND f.tag LIKE '%hello%'
OR f.tag LIKE '%world%'

問題のある領域:AND f.tag LIKE '%hello%' OR f.tag LIKE '%world%'

理解しておくべき重要なことは、「hello」と「world」が常にクエリに含まれているとは限らないということです。さらに、さらに3つの検索が追加される可能性がありますが、menu_item_id常に検索されます。

すべての結果に各f.tagが必要なわけではなく、結果にそれらのいずれか(OR)を含めるだけです。

どんな助けでもいただければ幸いです。

4

5 に答える 5

3

のように...括弧?

SELECT t.*, u.username AS owner, uu.username AS replyname, a.location
FROM thread t
INNER JOIN filter_thread as ft ON t.thread_id = ft.thread_id
INNER JOIN filter as f ON f.filter_id = ft.filter_id
INNER JOIN users u ON t.owner_id = u.id 
INNER JOIN users uu ON t.last_post_id = uu.id
INNER JOIN user_profiles AS up ON u.id = up.user_id
INNER JOIN avatars AS a ON up.avatar_id = a.id
WHERE t.menu_item_id='1'
AND (
    f.tag LIKE '%hello%'
 OR f.tag LIKE '%world%'
)

このクエリが動的に行われることが問題である場合は1、先頭にを追加するだけです。

于 2012-07-26T15:45:39.450 に答える
2

括弧を使用して、ANDおよびの優先順位を指定しますOR

a AND (b OR c)

対。

(a AND b) OR c

例えば:

WHERE t.menu_item_id='1'
  AND (    f.tag LIKE '%hello%'
        OR f.tag LIKE '%world%'
      )

これにより、menu_item_id = '1'であり、'hello'または'world'のいずれかを含むタグを持つ行のみが返されます。

于 2012-07-26T15:45:25.553 に答える
0

これがあなたの質問に答えるかどうかはわかりませんが、かっこを使って読みやすくするのが好きです。

SELECT t.*, u.username AS owner, uu.username AS replyname, a.location
FROM thread t
INNER JOIN filter_thread as ft ON t.thread_id = ft.thread_id
INNER JOIN filter as f ON f.filter_id = ft.filter_id
INNER JOIN users u ON t.owner_id = u.id 
INNER JOIN users uu ON t.last_post_id = uu.id
INNER JOIN user_profiles AS up ON u.id = up.user_id
INNER JOIN avatars AS a ON up.avatar_id = a.id
WHERE t.menu_item_id='1'
AND (f.tag LIKE '%hello%'
OR f.tag LIKE '%world%')

ここで、(t.menu_item_id = 1 AND f.tag LIKE'%hello%')OR f.tag LIKE'%world%と言うのではなく、t.menu_item_id=1かつ括弧内の条件のいずれかが真であると言っています。 '

お役に立てば幸いです。

于 2012-07-26T15:46:51.733 に答える
0

かっこを使ってみませんか?

WHERE t.menu_item_id='1' AND (f.tag LIKE '%hello%' OR f.tag LIKE '%world%') 
于 2012-07-26T15:47:52.183 に答える
0

PHPを介して動的に生成される最終的なコードは次のとおりです。

    $sql_select = "SELECT t.*, u.username AS owner, uu.username AS replyname, a.location";
    $sql_from = " FROM ";
    $sql_where = " WHERE ";
    $sql_joins = "";
    $sql_order = " ORDER BY t.replystamp DESC
                    LIMIT $threadstart, $limit";  
    $sql_from .= ' thread t ';
    $sql_where .= " t.menu_item_id=$menu_item_id";
    $sql_joins .= ' INNER JOIN filter_thread as ft ON t.thread_id = ft.thread_id
                    INNER JOIN filter as f ON f.filter_id = ft.filter_id
                    INNER JOIN users u ON t.owner_id = u.id 
                    INNER JOIN users uu ON t.last_post_id = uu.id
                    INNER JOIN user_profiles AS up ON u.id = up.user_id
                    INNER JOIN avatars AS a ON up.avatar_id = a.id';
    if ($ac_total > 0) {
        $sql_where .= " AND (";
        for ($i=0; $i < $ac_total; $i++)
        {
            if ($i == 0)
            {
                $sql_where .= "f.tag LIKE '%$active_category[$i]%'";
            } else {
                " OR f.tag LIKE '%$active_category[$i]%')";
            }
        }
        $sql_where .= ")";
    }
    $sql = $sql_select . $sql_from . $sql_joins . $sql_where . $sql_order;
    $query = $this->db->query($sql);

助けてくれてありがとう!

于 2012-07-26T16:30:00.103 に答える