这两天研究了查询和解析键值对形式的数据库数据操作.
先来看一个用到子查询的SQL语句:
$sql = "
SELECT `user_id`,`meta_key`,`meta_value`
FROM `wp_usermeta`
WHERE user_id
IN
(SELECT author FROM wp_flag_gallery )
AND
(meta_key = 'nickname' OR meta_key = 'description')
ORDER BY user_id, meta_key";
这是一个WordPress插件: flash-album-gallery 的表.这个插件我会专门撰文介绍,作为Flex相册的后台极为有用.
通过将相册中的用户信息作为WHERE的目标,查询出了几个键值对形式的数组.
这里我还不知道如何直接在SQL中将拥有同一个id的几个行合并为一个,所以只好在PHP端进行这个工作.
看看PHP端的解析方法:
/**
* 查询WordPress中相册作者的相关信息
*
* @return array 每个子项为一个user的信息.<br />
*
*/
function getGalleryAuthorsInfo ()
{
if (count($this->users_array) > 0)
{
$this->users_array = array(0);
}
$sql = "
SELECT `user_id`,`meta_key`,`meta_value`
FROM `wp_usermeta`
WHERE user_id
IN
(SELECT author FROM wp_flag_gallery )
AND
(meta_key = 'nickname' OR meta_key = 'description')
ORDER BY user_id, meta_key";
$result = $this->query($sql);
//清空可能存在的用户信息
if (count($this->users_array) > 0)
{
$this->users_array = array();
}
//合并用户信息
if ($result && is_array($result))
{
//对返回的数组排序,根据'user_id'列,把同样'user_id'的项目集中在一起
asort($result);
$isNewUser = TRUE;
$curUser = array();
for ($i = 0; $i < count($result); $i ++)
{
$info = $result[$i];
if ($isNewUser)
{
$isNewUser = FALSE;
$curUser['user_id'] = $info['user_id'];
}
//新的信息
switch ($info['meta_key'])
{
case 'description':
$curUser['description'] = $info['meta_value'];
break;
case 'nickname':
$curUser['nickname'] = $info['meta_value'];
break;
}
if (!$isNewUser && $curUser['description'] != NULL && $curUser['nickname'] != NULL)
{
array_push($this->users_array, $curUser);
$isNewUser = TRUE;
$curUser = array();
}
} //end for
} //end if
else
{
return 0;
} //end else
return $this->users_array;
} //end function
整理结果:
//获取WordPress的用户信息: getGalleryAuthorsInfo()
Array (
[0] => Array (
[user_id] => 3
[description] => 您的个性独一无二,让我们为您展示最独特的个性风采吧!
[nickname] => 个性写真 )
[1] => Array (
[user_id] => 4
[description] => 幸福情侣的图片作品
[nickname] => 幸福情侣 )
)
output: 2
这个日志的关键在于:
1,学习了使用IN关键字的子查询,这里有一点要注意,在WHERE 中如果同时使用AND和OR关键字,要注意AND的优先级比OR高,所以如果不加()的话可能会造成OR的条件被忽略.
比如:
...
AND (meta_key = 'nickname' OR meta_key = 'description')
...
如果不加上括号,meta_key = ''这个条件就不会被考虑.
另外,如果使用ORDER BY子句,应保证它是SELECT查询最后一个子句,否则会报错.
2,在整理这种情况的返回数据时,最好别忘了先给$result数组排序,用asort()函数可以做到保持键值对关系的排序.虽然在数据库查询的时候已经做了ORDER BY的排序,但是在PHP端再次排序能保证PHP端方法的强壮性.
- 大小: 15.9 KB
分享到:
相关推荐
Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于键值对的数据存储系统。它常被用作数据库、缓存和消息中间件,因其高效的读写速度和丰富的数据结构而备受青睐。这篇笔记将探讨Redis的一些...
在探讨"C#学习心得"这一主题时,我们深入解析了如何在C#应用程序中有效管理数据库连接字符串,尤其是在Web应用程序中利用Web.Config文件进行配置。这一实践不仅体现了C#编程语言的强大灵活性,也展示了其在处理...
Redis是一款高性能的键值对数据库,它以C语言编写,被广泛应用于缓存、消息队列、数据库等多个领域。这份“redis阅读笔记.zip”压缩包很可能是某位开发者在深入研究Redis源码后整理的心得体会,以Windows画图的形式...
在本文中,作者分享了一些关于网页数据下载与控制的心得体会,包括使用浏览器工具、解析网页关键字以及利用不同方法下载数据。 首先,作者提到了概述和感谢,指出在程序中嵌入网页或下载数据到本地数据库的需求,并...
范型篇――介绍谷歌、亚马逊、微软、阿里巴巴等著名互联网公司的大规模分布式存储系统架构,涉及分布式文件系统、分布式键值系统、分布式表格系统以及分布式数据库技术等。实践篇――以阿里巴巴的分布式数据库Ocean...
通过对上述代码的分析,我们不仅了解了`TMemo`控件的高级操作技巧,如光标位置的获取与控制、文本选择范围的设定等,还深入探讨了数据库操作的关键概念,包括别名的创建、数据查找与定位的方法。这些知识点对于IT...
同时,还引入了关联数组的概念,方便进行键值对的数据存储。 此外,PHP5的正则表达式功能也得到了增强,支持了PCRE(Perl Compatible Regular Expressions),使得字符串匹配和替换更为强大。手册会详细解释正则...
《Redis 深度历险》是一本深入探讨 Redis 数据库特性和实战应用的书籍,其学习笔记与实践内容丰富,涵盖了 Redis 的...在阅读笔记中,你将看到作者对每个主题的深入解析和实践心得,帮助你在 Redis 的世界里游刃有余。
【谷歌师兄的LeetCode刷题笔记-LBDB:小兄弟的数据库】 在编程领域,LeetCode是一个非常知名的在线平台,它提供了丰富的算法题目...这样的学习过程将不仅提升我们的编程能力,也能加深对数据结构和数据库原理的理解。
哈希表是另一种重要的数据结构,用于快速查找和存储键值对。 **4.1 哈希表** OpenSSL中的哈希表实现了基本的增删改查操作,能够高效地管理大量数据。 **4.2 哈希表数据结构** `OPENSSL_Hash`结构体定义了哈希表...
最后,个人笔记部分通常包含学习者对以上内容的理解和实践心得,可能包括问题解决方案、代码示例和重要知识点的总结,对于巩固学习效果十分有益。 总之,这套"Python就业视频资料"是一份全面的Python学习资源,覆盖...
- **SharedPreferences使用**:介绍SharedPreferences这一轻量级的数据存储方式,适用于保存简单的键值对数据。 ##### 4. 网络通信与服务 - **网络请求与响应处理**:指导如何实现HTTP请求,获取服务器端数据,并...
- **SharedPreferences**:轻量级的数据存储方式,适合保存简单的键值对数据。 - **SQLite数据库**:适用于存储结构化数据,提供类似SQL的查询语言。 - **文件存储**:可以将数据保存为文件形式,如文本文件或二进制...
- **`Map`**:键值对存储结构,如`HashMap`、`ConcurrentHashMap`等。 - **`ConcurrentHashMap`与`HashMap`的区别**: - `ConcurrentHashMap`在JDK 1.7中通过分割锁技术实现并发控制,在JDK 1.8中引入了红黑树优化...
### WebSphere Portal V6.0 调优技术解析 #### 环境性能调优概述 本章节主要介绍在WebSphere Portal V6.0环境下如何进行系统性能调优。性能调优是确保应用程序能够在高负载下保持稳定运行的关键步骤。通过对应用...
1. **存储过程**:存储过程是预编译的SQL语句集合,可以在数据库中预先定义并存储,当需要执行时调用,减少了网络传输和解析的时间,提高性能。 2. **参数化查询**:存储过程接受多个输入参数,如表名、主键、字段...
- **SQLite数据库**:轻量级的关系型数据库,常用于存储应用内的结构化数据。 - **UserDefaults**:简单的键值存储服务,适合保存少量的设置信息或临时数据。 ### 三、课程内容概览 #### 3.1 第1-8课内容介绍 根据...
- 字典(dict):无序键值对集合。 #### 三、控制结构与函数 1. **变量与运算符**: - 算术运算符:加(+), 减(-), 乘(*), 除(/), 模(%), 幂(**), 取整除(//)。 - 比较运算符:等于(==), 不等于(!=), 大于(>), 小于...
用于存储键值对。 ### 21. IFeatureWorkspace接口(esriGeoDatabase) 提供对工作空间中特征类的操作。 ### 22. IWorkspaceEdit接口(esriGeoDatabase) 支持事务处理和版本控制等功能。 ### 23. ...
对于数据存储,Flutter提供了多种解决方案,如`shared_preferences`用于轻量级的偏好设置存储,`sqflite`用于本地SQLite数据库,或者`hive`库提供更高级的键值对存储。在v2ex_flutter应用中,可能会使用这些技术之一...