草庐IT

update_by_query

全部标签

mysql - 如何针对单个 Query 进一步优化此 MySQL 表

我有一个包含约100万行的InnoDBMySqlGeoID表。表结构是这样的:CREATETABLE`geoid`(`start_ip`int(11)NOTNULL,`end_ip`int(11)NOTNULL,`city`varchar(64)NOTNULL,`region`char(2)NOTNULL,PRIMARYKEY(`start_ip`,`end_ip`))ENGINE=InnoDBDEFAULTCHARSET=latin1;只会对该表运行一种类型的查询:SELECTcity,regionFROMgeoidWHERE1259650516BETWEENstart_ipANDe

mysql - 在不使用嵌套查询的情况下使用 GROUP BY 和 ORDER BY 优化 JOINed 表上的 MySQL 查询

对我来说,这有点像是一个初学者SQL问题,但这里是。这就是我想要做的:将三个表连接在一起,产品、标签和一个链接表。将标签聚合到一个逗号分隔的字段中(因此是GROUP_CONCAT和GROUPBY)限制结果(最多30个)按照“创建”日期的顺序排列结果尽可能避免使用子查询,因为使用ActiveRecord框架编写代码特别不愉快我已经在这篇文章的底部描述了所涉及的表,但这是我正在执行的查询SELECTp.*,GROUP_CONCAT(pt.name)FROMproductspLEFTJOINproduct_tags_for_productspt4pON(pt4p.product_id=p.i

ORDER BY LIMIT 查询的 MySQL 索引用法

我正在使用包含超过200万条记录的“用户”表。查询是:SELECT*FROMusersWHERE1ORDERBYfirstnameLIMIT$start,30“名字”列已编入索引。获取第一页非常快,而获取最后一页非常慢。我使用了EXPLAIN,结果如下:对于EXPLAINSELECT*FROM`users`WHERE1ORDERBY`firstname`LIMIT10000,30我得到:idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEusersindexNULLfirstname194NULL10030但是

mysql - 如何在不在where子句中添加表名或表别名的情况下避免 "Ambiguous field in query"

我有一个选择查询,其中我加入了几个表,比如T1和T2两个表都有一个名为STATUS的字段,我不需要获取。在where子句中,我需要添加WHERESTATUS=1和更多条件。但不知何故,我无法将表名或表别名添加到where子句中的字段,即我无法使用whereT2.STATUS=1。有什么方法可以始终将where子句中的STATUS=1视为T1.STATUS以便我可以避免“模糊字段错误”?这是一个示例查询:selectT1.name,T1.address,T1.phone,T2.title,T2.descriptionfromT1LeftJoinT2onT1.CID=T2.IDwhereS

MySQL GROUP BY 优化 - InnoDB 与 MyISAM?

问题有谁知道为什么没有对基于MyISAM的表进行GROUPBY优化?(我使用的是这个版本:5.1.49-3)测试表CREATETABLE`_test2_innodb`(`i`int(10)unsignedNOTNULLAUTO_INCREMENT,`n`smallint(5)unsignedNOTNULL,`t`int(10)unsignedNOTNULL,`v`smallint(6)NOTNULL,PRIMARYKEY(`i`),KEY`i_n`(`n`),KEY`i_t`(`t`))ENGINE=InnoDBDEFAULTCHARSET=latin1CREATETABLE`_tes

mysql - 为什么 ORDER BY 不使用索引?

这是我的表格:CREATETABLE`person`(`id`bigint(10)NOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,`age`int(10)NOTNULLDEFAULT'0',PRIMARYKEY(`id`),KEY`age`(`age`))ENGINE=InnoDBAUTO_INCREMENT=10000DEFAULTCHARSET=latin1;这是解释的输出:mysql>explainselect*frompersonorderbyage\G***************************1.row****

php - 我的 sql 查询使用 GROUP BY 函数获取中间行值

我的数据库结构是这样的IdPriceCode10.129320.139330.549340.969350.109460.309470.909481.409492.3094我必须使用代码分组来获取数据,并且我希望将中间行作为输出。在上面的示例中,我希望输出为IdPriceCode30.549370.9094以上是我想要的输出,中间行或具有最大价格的行(如果有两个中间行,例如行数为4、6、8的情况) 最佳答案 可以通过一些技巧来实现。SELECTid,price,codeFROMtable1WHEREidIN(SELECTCeil(Av

mysql - 添加 JOIN 和 ORDER BY 查询后性能意外提升

我有以下People表:|Id|FirstName|Children||----|-----------|----------||1|mark|4||2|paul|0||3|mike|3|请注意,我在FirstName中有一个非唯一索引,在Children中有另一个索引。我需要获得每个有child的人的前10000个名字和child数量。所以我决定采用这种解决方案:SELECTfirstName,childrenFROMpeopleWHEREchildren>0ORDERBYchildrenDESCLIMIT0,10000问题是从一个有260万条记录的表中返回结果需要4秒。这是解释:|

php - 使用新的 wp_query 将 sql 查询转换为 wordpress 查询

我正在尝试将sql查询转换为wordpress查询,但无法理解它是如何完成的?我尝试转换为newwp_query的查询$query="SELECTSQL_CALC_FOUND_ROWSdistinctwp_posts.IDFROMwp_postsINNERJOINwp_postmetaON(wp_posts.id=wp_postmeta.post_id)INNERJOINwp_postmetaASmt1ON(wp_posts.id=mt1.post_id)WHERE1=1ANDwp_posts.idNOTIN(0)ANDwp_posts.post_type='topic'AND(wp_

php - Magento group by 日期字段的子句

我需要获取指定月份一天内“grand_total”的订单总数、SUM、MINMAX和AVG。这就是我正在做的。$collection->getSelect()->columns('SUM(base_grand_total)AStotal')->columns('COUNT(*)ASorders_count')->columns('DATE_FORMAT(created_at,"%d")ASorder_day')->columns('DATE_FORMAT(created_at,"%d/%m/%y")ASorder_date')->columns('AVG(base_grand_tota