1

次のコードがありますが、問題があります。

$query = "SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff FROM #__jblance_project p ".
                 "WHERE p.status=".$db->quote('COM_JBLANCE_OPEN')." AND p.approved=1  AND '$now' > p.start_date AND  p.id_category=202 ".
                 "ORDER BY p.is_featured DESC, p.id DESC ".

問題は、フィールド id_category に次のような複数の値がある場合です

202,203,204

コードを次のように変更しても、結果は表示されません

AND  p.id_category=202 OR .id_category=203 OR .id_category=204

セルにはカンマで区切られたすべての値が含まれているため

何かアドバイス。

ありがとう。

4

4 に答える 4

0
$query = "SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff FROM #__jblance_project as p ". "WHERE p.status=".$db->quote('COM_JBLANCE_OPEN')." AND p.approved=1 AND '$now' > p.start_date AND p.id_category=202 ". "ORDER BY p.is_featured DESC, p.id DESC ".

FROM #__jblance_projectaspとして追加

于 2012-11-28T12:56:09.093 に答える
0

私のコメントを拡張して、これを変更することを検討してください:

SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
FROM #__jblance_project p
WHERE p.status=<something>
AND p.approved=1  AND '$now' > p.start_date 
AND p.id_category=202
ORDER BY p.is_featured DESC, p.id DESC

次のようなものに:

SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
FROM #__jblance_project p
WHERE p.status=<something>
AND p.approved=1  AND '$now' > p.start_date 
AND 0 < FIND_IN_SET(202, p.id_category)
ORDER BY p.is_featured DESC, p.id DESC

また、おそらく完全な PHP ステートメントを次のように記述します。

$query = sprintf('SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
    FROM #__jblance_project p
    WHERE p.status=%s
    AND p.approved=1  AND '%s' > p.start_date 
    AND 0 < FIND_IN_SET(202, p.id_category)
    ORDER BY p.is_featured DESC, p.id DESC', $db->quote('COM_JBLANCE_OPEN'), $now);

これは、「正しい」解決策というよりも回避策であることに注意してください。カンマ区切りのリストではなく、フィールドごとに 1 つのエントリを持つように、データベースを再フォーマットすることを検討する必要があります。

2 番目の 2 つは string 関数を使用しますが、FIND_IN_SETこれは厄介なことに目標を達成するはずです。

この関連する質問、特に回答とコメントは参考になる場合があります。

于 2012-11-28T13:03:45.867 に答える
0

これを行うための本当に確実な方法はありません...次のような醜いもので立ち往生しています:

id_category LIKE "%,123" OR
id_category LIKE "123,%" OR
id_category LIKE "%,123,%" OR
id_category = "123"

これが非常に醜い理由は、このように区切られたフィールドを使用するのは悪い考えだからです。代わりに、2 つの列を持つ別のテーブルを作成する必要があります。

  • プロジェクトの ID
  • カテゴリの ID

これは多対多の関係です。

ハックをさらに進めたい場合は、次のように id_category をフォーマットしないことをお勧めします。

123,456,789

代わりに:

,123,456,789,

そのため、前後にカンマを入れてください。少なくとも、like クエリを次のように単純化できます。

id_category LIKE "%,123,%"

編集:私は知りませんでしたFIND_IN_SET。これは有効な解決策のように思えますが、データを正規化することでより良い結果が得られます。

于 2012-11-28T13:05:11.800 に答える
0

mysql で IN() キーワードを使用しています。

p.id_category IN (202,203,204)

ここでは、動的カテゴリ ID 配列を次のように渡すことができます。

$array_cat_id = impload(',' ,$pass_array_of_the_id);

p.id_category IN ($array_cat_id)
于 2012-11-28T13:09:37.730 に答える