duanpin2034 2016-10-11 06:16
浏览 42
已采纳

如何通过Zend Framework 2加入LIKE

I have a table containing daily counts of user agents hitting my server:

browser_stats_daily
+----+-------------+----------------------------------------------------------------------+--------------+
| id | access_date | user_agent                                                           | num_requests |
+----+-------------+----------------------------------------------------------------------+--------------+
|  6 | 2016-09-24  | Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)      |         4729 |
| 10 | 2016-09-24  | Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko        |        16396 |
| 12 | 2016-09-24  | Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko |        33623 |
| 17 | 2016-09-24  | MobileSafari/602.1 CFNetwork/808.0.2 Darwin/16.0.0                   |           98 |
| 28 | 2016-09-24  | Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)     |        10333 |
| 33 | 2016-09-24  | Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko |         5745 |
| 34 | 2016-09-24  | Mozilla/5.0 (compatible; AhrefsBot/5.1; +http://ahrefs.com/robot/)   |            5 |
| 46 | 2016-09-24  | Mozilla/5.0 (Windows NT 6.1; rv:49.0) Gecko/20100101 Firefox/49.0    |          339 |
| 51 | 2016-09-24  | -                                                                    |           13 |
| 53 | 2016-09-24  | MobileSafari/601.1 CFNetwork/758.5.3 Darwin/15.6.0                   |           38 |
+----+-------------+----------------------------------------------------------------------+--------------+

I'm trying to generate a simple report of major/minor browser versions - for this, I have a table of user agent matches:

user_agents
+----+----------------+---------+----------+-------+-------+
| id | user_agent     | vendor  | platform | major | minor |
+----+----------------+---------+----------+-------+-------+
|  2 | %Firefox/38.0% | Mozilla | Firefox  |    38 | 38.0  |
+----+----------------+---------+----------+-------+-------+

I've shown this can work with the query:

select distinct(bsa.user_agent), ua.vendor 
from user_agents as ua 
right join browser_stats_daily as bsa 
on bsa.user_agent LIKE ua.user_agent 
where ua.vendor is not null limit 10;

Which returns:

+----------------------------------------------------------------------------------------+---------+
| user_agent                                                                             | vendor  |
+----------------------------------------------------------------------------------------+---------+
| Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0               | Mozilla |
| Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0                      | Mozilla |
| Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0              | Mozilla |
| Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0               | Mozilla |
| Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0                      | Mozilla |
| Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/38.0 Firefox/38.0; ADSSO            | Mozilla |
| Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:38.0) Gecko/20100101 Firefox/38.0     | Mozilla |
| Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:38.0) Gecko/20100101 Firefox/38.0      | Mozilla |
+----------------------------------------------------------------------------------------+---------+

But when I try to use that query through Zend Framework's SQL TableGateway, I get an error on the LIKE:

SQLSTATE[42000]: Syntax error or access violation: 
1064 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 
'`LIKE` `user_agents`.`user_agent` WHERE `user_agents`.`user_agent` IS NOT NULL'

Here's the code I'm using to build the query:

$select = $this->tableGateway->getSql()->select();

$select->quantifier(Select::QUANTIFIER_DISTINCT);

$select->columns(array(
    "user_agent",
));

$select->join(
    "browser_stats_daily",
    "browser_stats_daily.user_agent LIKE user_agents.user_agent",
    Select::SQL_STAR,
    Select::JOIN_RIGHT
);

$select->where->isNotNull("user_agents.user_agent");

return $this->tableGateway->selectWith($select);
  • 写回答

1条回答 默认 最新

  • duanchan9354 2016-10-11 12:44
    关注

    This is possible using the ON clause as a ExpressionInterface :

    $on = new Literal('browser_stats_daily.user_agent LIKE user_agents.user_agent');
    $select = $this->tableGateway->getSql()->select();
    $select->quantifier(Select::QUANTIFIER_DISTINCT)
           ->columns(["user_agent"])
           ->join("browser_stats_daily", $on, Select::SQL_STAR, Select::JOIN_RIGHT)
           ->where->isNotNull("user_agents.user_agent");
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题