【问题标题】:Rownum in sql INNER JOIN?sql INNER JOIN中的Rownum?
【发布时间】:2011-10-18 19:24:22
【问题描述】:

我想在下面的查询选择中使用rownum,我在下面的第一个查询中使用它,但不知道在下面的第二个查询中应该如何使用它?

第一个有效的查询:

$this -> db -> query("
SELECT @rownum := @rownum + 1 rownum, 
       t.* 
FROM   (SELECT * 
        FROM   table 
        ORDER  BY id DESC 
        LIMIT  $offset, $coun) t, 
       (SELECT @rownum := 0) r 
")

我在foreach上的html代码中回显rownum为:echo intval($row -> rownum + $offset)

第二个查询(我想在这个查询中使用它,这个查询怎么样?):

$this -> db -> query("
SELECT tour_foreign.id, 
       tour_foreign.name, 
       tour_foreign_residence.name_re, 
       tour_foreign.service, 
       tour_foreign.date_go, 
       tour_foreign.date_back, 
       tour_foreign.term 
FROM   tour_foreign 
       INNER JOIN tour_foreign_residence 
         ON ( tour_foreign.id = tour_foreign_residence.relation ) 
WHERE  tour_foreign.name LIKE "%' . $find . '%" 
        OR tour_foreign_residence.name_re LIKE "%' . $find . '%"
")

【问题讨论】:

  • 在 select 语句中读取和分配相同的变量是明确未定义的行为,请参阅有关这些主题的(措辞不好的)手册。从 8.0 开始,可以使用窗口函数。

标签: php mysql codeigniter join


【解决方案1】:

试试这个,只需将 @rownum 添加到 SELECT 列表的开头,并将 @rownum 重置为末尾的隐式 JOIN。我用类似的 JOIN 对我的一个数据库进行了测试,它似乎工作正常。

将显式JOINs 与针对@rownum 重置伪表的隐式连接混合起来看起来很奇怪,但我不知道在没有公共列时在那里执行显式JOIN 的方法。如果有人可以改善这种情况,请发表评论。

$this -> db -> query("
SELECT
       @rownum := @rownum + 1 rownum,
       tour_foreign.id, 
       tour_foreign.name, 
       tour_foreign_residence.name_re, 
       tour_foreign.service, 
       tour_foreign.date_go, 
       tour_foreign.date_back, 
       tour_foreign.term 
FROM   tour_foreign 
       INNER JOIN tour_foreign_residence 
         ON ( tour_foreign.id = tour_foreign_residence.relation ),
       (SELECT @rownum := 0) r
WHERE  tour_foreign.name LIKE "%' . $find . '%" 
        OR tour_foreign_residence.name_re LIKE "%' . $find . '%"
");

更新不带ON 子句的显式JOIN 也可以:

FROM   tour_foreign 
       INNER JOIN tour_foreign_residence 
         ON ( tour_foreign.id = tour_foreign_residence.relation )
       JOIN (SELECT @rownum := 0) r

【讨论】:

  • 你可以 ... CROSS JOIN (SELECT @rownum := 0) r 或(在 MySQL 中有效!)JOIN 没有 ON 子句:... JOIN (SELECT @rownum := 0) r
  • @ypercube 我尝试LEFT JOIN 没有ON 子句,这是一个语法错误。你是对的 - 直接JOIN 有效。
  • 也可以有a CROSS JOIN b ON a.id=b.id。 INNER JOIN 和 CROSS JOIN 之间没有区别!
【解决方案2】:

怎么样:

$this -> db -> query("SELECT @rownum := @rownum + 1 rownum, 
       t.* 
FROM   (SELECT tour_foreign.id, 
       tour_foreign.name, 
       tour_foreign_residence.name_re, 
       tour_foreign.service, 
       tour_foreign.date_go, 
       tour_foreign.date_back, 
       tour_foreign.term 
FROM   tour_foreign 
       INNER JOIN tour_foreign_residence 
         ON ( tour_foreign.id = tour_foreign_residence.relation ) 
WHERE  tour_foreign.name LIKE "%' . $find . '%" 
        OR tour_foreign_residence.name_re LIKE "%' . $find . '%") t, 
       (SELECT @rownum := 0) r 
")

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2018-03-09
    • 2013-07-01
    • 1970-01-01
    • 2023-03-17
    • 2020-02-08
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多