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

表news,id是主键,title-是标题字段,cat-新闻有四种类别,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 之前和之后的 4(或 n)id 范围内也排序 desc

2)案例添加新闻- id 不可用,或者在 php 中插入后是 mysql_insert_id() 相同的功能 - 最后 10 个 id 具有相同的 cat = 4 和相反的 lang = 2

到目前为止,我已经尝试过:

对于案例 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 之前和之后得到了 4 个 id,而不是来自我需要的 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 回答