SELECT ir.* FROM ir LEFT JOIN i ON ir.item_id=i.id AND ir.id=20;
| id | gold   | item_id | item_n | name      |
+----+--------+---------+--------+-----------+
| 10 | 100000 |       0 |      0 | NULL      |
| 20 |      0 |    5165 |     10 | 物品名字  |
| 30 |      0 |    5011 |      2 | NULL      |
| 40 |      0 |    5136 |      5 | NULL      |
| 50 |      0 |    5167 |     15 | NULL      |
| 60 |      0 |    5144 |      1 | NULL      |
| 70 |      0 |    5145 |      4 | NULL      |
| 80 |      0 |    5168 |     15 | NULL      |
| 90 |      0 |    5166 |     15 | NULL      |SELECT ir.* FROM ir LEFT JOIN i ON ir.item_id=i.id WHERE ir.id=20;
| 20 |      0 |    5165 |     10 | 物品名字  |查询结果颠覆了我的认知,不是说on的条件在join前执行么,那第一种应该在join前就把其他8条记录给否决掉了,怎么看起来 AND ir.id=20 完全没起作用

解决方案 »

  1.   

    嗯,那为什么第一种AND ir.id=20 完全没起作用
      

  2.   

    对。你用inner join 就知道了。
      

  3.   

    left join是左边表的内容全部显示出来,然后右边得表显示和左边得表匹配得结果你可以全部打印出来两个表的列  就能看出来点东西了 
    不要只打印左边得那个表
      

  4.   

    嗯,谢谢,狼头一说我就去看left join了,发现left 不管on啥,左边肯定都显示的
    不过on右边倒是可以
      

  5.   

    在你的ON条件中
    ir.item_id=i.id AND ir.id=20
    以ir为基准,不满足的条件的R表记录为NULL用WHERE ir.id=20去掉IR表中不满足条件的记录
      

  6.   

    反正我知道left join on 左表.字段=常数
    这类的条件是完全无效的