1
id  title   cat lang
6101    AAba    1   1
6102    AAad    4   2
6103    AAaf    4   2
6104    AAa 1   1
6105    AAtar   4   2
6106    AAao    1   1
6107    ABya    4   2
6108    ABar    4   2
6109    ACar    1   2
6110    BCad    3   1
6111    CCas    4   1
6112    DCas    4   2
6113    GCaz    2   2
6114    FCaew   2   2
6115    FCaw3   4   2
6116    FCa3    1   1
6117    FCa4    4   2
6118    FCa5    2   1
6119    FCa6    4   2 --- last id

テーブルニュース、idは主キー、title-はタイトルフィールド、cat-ニュースには4種類のカテゴリがあり、lang-言語コード1または2です。

次のことを達成したい:1)ケース編集ニュース-idが利用可能-たとえば6111、langは1、catは4これらのidとタイトルを収集したい:

6119
6117
6115
6112
6109
6105
6103
6102

これは反対の言語です-langは2で、同じカテゴリのcatは4で、指定されたid 6111の前後のidが4(またはn)の範囲内にあります。

2)ケース追加ニュース-idが利用できないか、phpに挿入した後mysql_insert_id()が同じ機能-同じcat=4で反対のlang=2の最後の10id

これまで私はこれを試しました:

ケース1の場合)phpスニペット:

   $id = 6111;
    $lang = 1;
    $tip = 4;
    $sql = "SELECT id, title 
            FROM pubs 
            WHERE id BETWEEN ".($id-4)." AND ".($id+4). " AND 
            tip = ".$tip." AND 
            lang <> ".$lang." 
            ORDER BY id DESC ";

しかし、これは、必要なidのコレクションからではなく、idの前後に4つのidを取得します。

ケース2の場合)

$sql = "SELECT id, title 
        FROM news 
        WHERE cat = 4 AND 
        lang <> 1 
        ORDER BY id DESC LIMIT 10";

これは機能しているようですが、私が間違っている可能性があります。

phpとmysqlでケース1を達成する方法はありますか?ケース2のより良い方法は?

4

2 に答える 2

2

あなたが持っているのは、だけであることを考えると$id、この恐ろしい見た目の獣は私が思いつくことができる最高のものです。私はそれを行うためのよりきちんとした方法があるとかなり確信していますが、これはうまくいくと思います修正済み

$id = 6111;

$query = "
  SELECT `id`, `title`
  FROM `news`
  WHERE `id` IN (
    SELECT * FROM (
      SELECT `id`
      FROM `news`
      WHERE `cat` = (
        SELECT `cat`
        FROM `news`
        WHERE `id` = ".$id."
      ) AND `lang` != (
        SELECT `lang`
        FROM `news`
        WHERE `id` = ".$id."
      ) AND `id` < ".$id."
      ORDER BY `id` DESC
      LIMIT 4
    ) `lower`
  ) OR `id` IN (
    SELECT * FROM (
      SELECT `id`
      FROM `news`
      WHERE `cat` = (
        SELECT `cat`
        FROM `news`
        WHERE `id` = ".$id."
      ) AND `lang` != (
        SELECT `lang`
        FROM `news`
        WHERE `id` = ".$id."
      ) AND `id` > ".$id."
      ORDER BY `id` ASC
      LIMIT 4
    ) `upper`
  )
  ORDER BY `id` DESC
";
于 2012-05-22T13:51:36.383 に答える
-1

このようなものが機能する可能性があります:

$sql = "SELECT id, title FROM pubs 
        WHERE tip = ".$tip." AND lang <> ".$lang." 
        ORDER BY id DESC 
        LIMIT ".($id-4).",".($id+4);

より洗練された解決策があるかもしれませんが、これで仕事は終わります。

于 2012-05-22T13:28:30.003 に答える