2017-02-16 58 views
0

我写了一个非常复杂的mysql查询并在mysql工作台中测试它,它工作得很好。但是当我在我的qt程序中使用这个查询时,它不起作用。Mysql查询在qt中不起作用

为了获得更好的分辨率,我有3个表格(产品,类别,产品类别),我想用parentId = 5和每个类别的2个产品获取3个类别。这里是我的功能:

void DbQueries::getFullCategories(int parent_id, int offset, int limit, int plimit) 
{ 
    ... 

    QSqlQuery q; 
    q.prepare("set @num := 0, @cid := '';" 
       "SELECT e.ProductId, e.title, e.price, e.rate, e.rateAvg, e.imgUrl, d.cid, d.ctitle" 
       "FROM products e," 
        "(SELECT ProductId, @num := if(@cid = categoryId, @num + 1, 1) as qty, @cid := categoryId as cid, title as ctitle" 
        "FROM (" 
         "SELECT b.ProductId, b.categoryId, a.title" 
         "FROM products_categories b, (SELECT catId, title FROM categories WHERE parentId = :parent_id LIMIT :limit OFFSET :offset) as a" 
         "WHERE b.categoryId = a.catId" 
         "ORDER BY b.categoryId" 
         ") as c" 
        ") as d" 
       "WHERE e.ProductId = d.ProductId AND d.qty <= :plimit" 
       "ORDER BY d.cid;"); 
    q.bindValue(":parent_id", parent_id); 
    q.bindValue(":limit", limit); 
    q.bindValue(":offset", offset); 
    q.bindValue(":plimit", plimit); 
    if(!q.exec()) 
     qDebug() << q.lastError().text(); 

    const QSqlRecord &r = q.record(); 
    qDebug() << r.count(); 

    ... 
} 

与此查询,exec()后,我没有错误,但没有记录在我的QSqlRecord牵强。我试图在:=之前放\,并且我得到了Unknown escape sequence '\:'

当我我的查询减少到这一点:

QSqlQuery q; 
q.prepare("SELECT b.ProductId, b.categoryId, a.title" 
      "FROM products_categories b, (SELECT catId, title FROM categories WHERE parentId = :parent_id LIMIT :limit OFFSET :offset) as a" 
      "WHERE b.categoryId = a.catId" 
      "ORDER BY b.categoryId"); 

我有mysql的错误,如:"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'b, (SELECT catId, title FROM categories WHERE parentId = 5 LIMIT 3 OFFSE' at line 1 QMYSQL: Unable to execute query"

+0

这有点混乱。重来。并参见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-询问 – Strawberry

回答

1

这个查询有一些重要的空白丢失:

 "SELECT b.ProductId, b.categoryId, a.title" 
     "FROM products_categories b, (SELECT catId, title FROM categories WHERE parentId = :parent_id LIMIT :limit OFFSET :offset) as a" 
     "WHERE b.categoryId = a.catId" 
     "ORDER BY b.categoryId" 

修复是真的简单:

 "SELECT b.ProductId, b.categoryId, a.title" 
     " FROM products_categories b, (SELECT catId, title FROM categories WHERE parentId = :parent_id LIMIT :limit OFFSET :offset) as a" 
     " WHERE b.categoryId = a.catId" 
     " ORDER BY b.categoryId" 
     -^-