作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么 Doctrine (1.2) 使用 WHERE IN
而不是 LIMIT
?
这段代码:
Doctrine_Query::create()
->from('Table t')
->limit(10)
->getSqlQuery();
返回这样的东西:
SELECT t.id_table AS t__id_table FROM table AS t WHERE t__id_table IN (1,2,3,4,10,12,18,20,21,25);
取而代之的是:
SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10;
此行为对于任何 LIMIT
值都是相同的。这会为高 LIMIT
值生成非常长的查询。
额外问题:Doctrine 如何知道要使用什么 ID? (通过向数据库发送另一个查询??)
最佳答案
那是因为 LIMIT
操作的是数据库行而不是“对象”。当您键入 $q->limit(10)
时,您想要获取十个对象,而不是数据库中的十行。
考虑以下查询(产品和类别具有多对多关系):
SELECT p.*, c.* FROM product p
INNER JOIN product_category_ref pcr ON p.id = pcr.prodcut_id
INNER JOIN category c ON c.id = pcr.category_id
WHERE p.price < 123;
要获取 10 个产品(对象),您的查询必须至少获取 20 行。您不能使用 LIMIT 10
因为(仅作为示例)只会退回 3 件产品。这就是为什么您需要找出应该获取哪些产品(限制适用于产品),然后再获取实际数据。
这将导致以下查询:
SELECT p.id FROM product p WHERE p.price < 123;
SELECT ..... WHERE p.id IN (...);
第二个查询可能返回 20、423 或 31 行。如您所见,这不是来自 limit()
的值。
附言。在这种情况下,Doctrine2 更加清晰,因为它使用 setMaxResults()
方法而不是 limit()
方法,后者不那么令人困惑。
关于php - 为什么 Doctrine 使用 WHERE IN 而不是 LIMIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4647547/
我是一名优秀的程序员,十分优秀!