`

解析键值对数据库数据心得

    博客分类:
  • PHP
阅读更多

这两天研究了查询和解析键值对形式的数据库数据操作.

先来看一个用到子查询的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心得笔记--180202

    Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于键值对的数据存储系统。它常被用作数据库、缓存和消息中间件,因其高效的读写速度和丰富的数据结构而备受青睐。这篇笔记将探讨Redis的一些...

    C#学习心得

    在探讨"C#学习心得"这一主题时,我们深入解析了如何在C#应用程序中有效管理数据库连接字符串,尤其是在Web应用程序中利用Web.Config文件进行配置。这一实践不仅体现了C#编程语言的强大灵活性,也展示了其在处理...

    redis阅读笔记.zip

    Redis是一款高性能的键值对数据库,它以C语言编写,被广泛应用于缓存、消息队列、数据库等多个领域。这份“redis阅读笔记.zip”压缩包很可能是某位开发者在深入研究Redis源码后整理的心得体会,以Windows画图的形式...

    网页数据下载与控制.pdf

    在本文中,作者分享了一些关于网页数据下载与控制的心得体会,包括使用浏览器工具、解析网页关键字以及利用不同方法下载数据。 首先,作者提到了概述和感谢,指出在程序中嵌入网页或下载数据到本地数据库的需求,并...

    《大规模分布式存储系统:原理解析与架构实战》PDF

    范型篇――介绍谷歌、亚马逊、微软、阿里巴巴等著名互联网公司的大规模分布式存储系统架构,涉及分布式文件系统、分布式键值系统、分布式表格系统以及分布式数据库技术等。实践篇――以阿里巴巴的分布式数据库Ocean...

    源碼任務心得分享

    通过对上述代码的分析,我们不仅了解了`TMemo`控件的高级操作技巧,如光标位置的获取与控制、文本选择范围的设定等,还深入探讨了数据库操作的关键概念,包括别名的创建、数据查找与定位的方法。这些知识点对于IT...

    php5的最新中文手册

    同时,还引入了关联数组的概念,方便进行键值对的数据存储。 此外,PHP5的正则表达式功能也得到了增强,支持了PCRE(Perl Compatible Regular Expressions),使得字符串匹配和替换更为强大。手册会详细解释正则...

    精品--读《Redis 深度历险》学习笔记与实践.zip

    《Redis 深度历险》是一本深入探讨 Redis 数据库特性和实战应用的书籍,其学习笔记与实践内容丰富,涵盖了 Redis 的...在阅读笔记中,你将看到作者对每个主题的深入解析和实践心得,帮助你在 Redis 的世界里游刃有余。

    谷歌师兄的leetcode刷题笔记-lbdb:小兄弟的数据库

    【谷歌师兄的LeetCode刷题笔记-LBDB:小兄弟的数据库】 在编程领域,LeetCode是一个非常知名的在线平台,它提供了丰富的算法题目...这样的学习过程将不仅提升我们的编程能力,也能加深对数据结构和数据库原理的理解。

    openssl中文版分析

    哈希表是另一种重要的数据结构,用于快速查找和存储键值对。 **4.1 哈希表** OpenSSL中的哈希表实现了基本的增删改查操作,能够高效地管理大量数据。 **4.2 哈希表数据结构** `OPENSSL_Hash`结构体定义了哈希表...

    Python就业视频资料.rar

    最后,个人笔记部分通常包含学习者对以上内容的理解和实践心得,可能包括问题解决方案、代码示例和重要知识点的总结,对于巩固学习效果十分有益。 总之,这套"Python就业视频资料"是一份全面的Python学习资源,覆盖...

    Beginning Android

    - **SharedPreferences使用**:介绍SharedPreferences这一轻量级的数据存储方式,适用于保存简单的键值对数据。 ##### 4. 网络通信与服务 - **网络请求与响应处理**:指导如何实现HTTP请求,获取服务器端数据,并...

    Android开发视频(老罗第一季)

    - **SharedPreferences**:轻量级的数据存储方式,适合保存简单的键值对数据。 - **SQLite数据库**:适用于存储结构化数据,提供类似SQL的查询语言。 - **文件存储**:可以将数据保存为文件形式,如文本文件或二进制...

    2019春季面试总结

    - **`Map`**:键值对存储结构,如`HashMap`、`ConcurrentHashMap`等。 - **`ConcurrentHashMap`与`HashMap`的区别**: - `ConcurrentHashMap`在JDK 1.7中通过分割锁技术实现并发控制,在JDK 1.8中引入了红黑树优化...

    Websphere portal tuning调优

    ### WebSphere Portal V6.0 调优技术解析 #### 环境性能调优概述 本章节主要介绍在WebSphere Portal V6.0环境下如何进行系统性能调优。性能调优是确保应用程序能够在高负载下保持稳定运行的关键步骤。通过对应用...

    asp.net 分页存储过程实例剖析心得

    1. **存储过程**:存储过程是预编译的SQL语句集合,可以在数据库中预先定义并存储,当需要执行时调用,减少了网络传输和解析的时间,提高性能。 2. **参数化查询**:存储过程接受多个输入参数,如表名、主键、字段...

    Stanford斯坦福大学公开课:ios10应用开发 中英文字幕()

    - **SQLite数据库**:轻量级的关系型数据库,常用于存储应用内的结构化数据。 - **UserDefaults**:简单的键值存储服务,适合保存少量的设置信息或临时数据。 ### 三、课程内容概览 #### 3.1 第1-8课内容介绍 根据...

    全网最热Python3入门+进阶 更快上手实际开发

    - 字典(dict):无序键值对集合。 #### 三、控制结构与函数 1. **变量与运算符**: - 算术运算符:加(+), 减(-), 乘(*), 除(/), 模(%), 幂(**), 取整除(//)。 - 比较运算符:等于(==), 不等于(!=), 大于(&gt;), 小于...

    ArcGIS接口详细说明

    用于存储键值对。 ### 21. IFeatureWorkspace接口(esriGeoDatabase) 提供对工作空间中特征类的操作。 ### 22. IWorkspaceEdit接口(esriGeoDatabase) 支持事务处理和版本控制等功能。 ### 23. ...

    v2ex_flutter:使用Flutter SDK构建的www.v2ex.com演示应用程序

    对于数据存储,Flutter提供了多种解决方案,如`shared_preferences`用于轻量级的偏好设置存储,`sqflite`用于本地SQLite数据库,或者`hive`库提供更高级的键值对存储。在v2ex_flutter应用中,可能会使用这些技术之一...

Global site tag (gtag.js) - Google Analytics