2017年5月7日星期日

Mysql中join的使用方法

在真正的Mysql应用中经常需要从多个数据表中读取数据。你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
  • 在命令提示符中使用 INNER JOIN

    假如我们在RUNOOB数据库中有两张表 tcount_tbl 和 runoob_tbl。两张数据表数据如下:

    实例

    尝试以下实例:

    测试实例数据

    mysql> use RUNOOB; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | runoob_author | runoob_count | +---------------+--------------+ | 菜鸟教程 | 10 | | RUNOOB.COM | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SELECT * from runoob_tbl; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 学习 PHP | 菜鸟教程 | 2017-04-12 | | 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 | | 3 | 学习 Java | RUNOOB.COM | 2015-05-01 | | 4 | 学习 Python | RUNOOB.COM | 2016-03-06 | | 5 | 学习 C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)
    接下来我们就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:

    INNER JOIN

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | a.runoob_id | a.runoob_author | b.runoob_count | +-------------+-----------------+----------------+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)
    以上 SQL 语句等价于:

    WHERE 子句

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | a.runoob_id | a.runoob_author | b.runoob_count | +-------------+-----------------+----------------+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)

    MySQL LEFT JOIN

    MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

    实例

    尝试以下实例,以 runoob_tbl 为左表,tcount_tbl 为右表,理解 MySQL LEFT JOIN 的应用:

    LEFT JOIN

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | a.runoob_id | a.runoob_author | b.runoob_count | +-------------+-----------------+----------------+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
    以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 runoob_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 runoob_author 字段值。

    MySQL RIGHT JOIN

    MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

    实例

    尝试以下实例,以 tcount_tbl 为左表,runoob_tbl 为右表,理解MySQL RIGHT JOIN的应用:

    RIGHT JOIN

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | a.runoob_id | a.runoob_author | b.runoob_count | +-------------+-----------------+----------------+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)
    以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 runoob_tbl 中没有对应的runoob_author 字段值。

    在 PHP 脚本中使用 JOIN

    PHP 中使用 mysqli_query() 函数来执行 SQL 语句,你可以使用以上的相同的 SQL 语句作为 mysqli_query() 函数的参数。
    尝试如下实例:

    MySQL ORDER BY 测试:

    $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '

    菜鸟教程 MySQL JOIN 测试

    '; echo '
    教程 ID作者登陆次数
    '; while($row = mysqli_fetch_array($retval, MYSQL_ASSOC)) { echo " {$row['runoob_id']}
". "{$row['runoob_author']} ". "{$row['runoob_count']} ". ""; } echo ''; mysqli_close($conn); ?>
输出结果如下图所示:

2017年4月23日星期日

Windows7音频服务未运行的解决方法

Windows7的使用者有时会遇到这样的问题,在任务栏右下角处,小喇叭打红叉,声音不能正常输出,而鼠标指向时提示“音频服务未运行”
就如同下图所示:

Windows7音频服务未运行的解决方法

方法/步骤

  1. 右键“计算机”(我的电脑)--->“管理”--> 打开“服务”,找到Windows Audio 服务,检查该服务启动类型是否为“自动”,重启动此服务,如若重启失败,右键该服务,属性,查看该服务的“依存关系”,找到这三个服务, 查看其是否已启动。如果发现没有启动,就试着启动一下,启动好就能听见久违的声音了。
  2. Windows7音频服务未运行的解决方法


2017年4月18日星期二

PHP数据采集方法

前言

我们在写一个Web程序的时候,总会想着把自己的网站更美观一些,功能能更多一些,有时候写一些小的工具或者加上小的插件会让我们的站点更加完善。比如万年历功能,比如我们现在要讲的天气预报功能。
当然我们没法利用专业的卫星接受数据,所以我们的天气数据来自现有的天气预报网站。利用天气预报网站提供的数据服务,我们可以写一个PHP爬虫,然后动态采集我们所需要的数据,并且在目标站点更新数据的时候,我们的程序也能做到同步更新,自动地获取数据。
下面就介绍一下如何编写一个简单的PHP数据采集程序(PHP爬虫)。

原理

给定一个网页的URL,使用PHP下载该网页并得到网页内容,然后通过正则表达式将其中我们感兴趣的数据提取出来,然后输出。
具体在这个例子中,我们要抓取的网页是 http://www.weather.com.cn/weather/101050101.shtml,我们感兴趣的是页面中的未来7天天气情况。

实现

0.获取天气预报网页的URL:

$url = "http://www.weather.com.cn/weather/101050101.shtml";
$page_content = file_get_contents($url);
在这里,file_get_contents() 函数会将 $url 指向的网页下载下来,并把网页内容作为一个字符串返回。于是,$page_content 变量中就是我们要抓取的网页的全部HTML代码了。接下来,我们要从其中抽取我们需要的数据。

1.使用正则表达式匹配符合条件的字符串

先输出 $page_content 的值,然后查看网页源代码,观察可知我们需要的字符串可以在

......

这两行的注释里找到。
使用正则表达式来取得  和  之间的所有内容:
eregi("(.*)",$page_content,$res);

2.补全页面中图片的路径

由于远程网页中的图片路径都是像 /m2/i/icon_weather/29x20/d01.gif 这样的相对路径,我们需要把这些路径补全,在它们前面加上 http://www.weather.com.cn
$forecast = str_replace("
至此,$forecast 中就是我们需要的天气预报信息了。这个简单的PHP爬虫也就写好了。

源代码

以下是这个抓取天气预报小程序的完整源代码,其中添加了一些测量各部分程序运行时间的代码,并可以通过设置 $start 和 $end 的值来控制抓取哪几天的信息。

$url = "http://www.weather.com.cn/weather/101050101.shtml";
$t1 = time();
    
$page_content = file_get_contents($url);
$t2 = time();

$start = 1;
$end = 3;

if ($end > 7){
    echo "超出预报能力范围,请重新设置!";
}else {
    echo "未来".($end-$start)."天哈尔滨的天气预报("
              .date('Y-m-j')."发布)";

    eregi("--day $start--(.*)--day $end--", $page_content, $res);

    $forecast = str_replace(",
        ", $res[0]);
    $t3 = time();

    echo $forecast;

    echo 'First step costs '.($t2 - $t1).' ms.';
    echo 'Last step costs '.($t3 - $t2).' ms.';
}

其他应用例子

同样的思路可以尝试的有:NBA每天的比分牌、今日新闻同步、股市行情等等,都能实现同步实时更新。

2017年4月12日星期三

新加坡10大在线购物网站

新加坡电子商务也正在迅猛发展,下面是10大在线购物网站介绍:
1. Qoo10.sg
1
Qoo10的前身是Gmarket在新加坡的分站,Gmarket发源于韩国,是韩国Giosis Gmarket和eBay合作的产品,在日本等地也有分站。Qoo10是一个在新加坡排名第一综合性的B2C (Business tocustomer)平台,相当于新加坡的“淘宝”。销售商品类别十分广泛,如:服装、化妆品、数码电子、母婴用品、保健品、食品等。为了培养顾客的忠诚度,Qoo10几乎每天都有促销和折扣等活动。
据了解,Qoo10上的商家并不都在新加坡本地,所以在Qoo10上购物的送货方式和到货时间都有很大不同。
2. Zalora.sg
2
Zalora是成立于2012年的时尚服饰电商平台,并且一直在扩张,得到了来自TengelmannGroup, Access Industries等投资方的多次投资。
除了这种B2C模式的平台,Zalora还推出了C2C平台,专门为一些第三方小商家服务。目前Zalora的业务已经拓展到了印度尼西亚、菲律宾和越南等地。
Zalora的平台优势在于专售品质好的服装并且价格公道,每天都会有上百件新品发布,其中包含了众多的知名品牌,如:Topshop, New Look, Mango, River Island, Daniel Wellington, Adidas,Nike…Zalora最受买家青睐的一点是可以免费30天内无理由退货,连运费都不用付。
3. Lazada.sg
3
Lazada是成立于2012年在东南亚各地开设的B2C电商平台,分别在印度尼西亚、越南、马来西亚、泰国与菲律宾开设了电子商务服务,2014年正式进军新加坡。
该平台为消费者提供各类商品,包括保健美容、家居生活与电子产品等,产品涵盖面积十分广泛。Lazada销售的商品以高大上著称,所以对卖家要求非常严格,卖家收到订单后需在48小时内发货,否则系统将会自动退款给顾客,并且会处以卖家相应的罚款,因此物流速度上服务非常好,吸引了众多的顾客。
4. www.maxmarket.sg
4
Maxmarket主攻韩国美容护肤品,各大主流韩国品牌到二线品牌都有。免了网络个人代购有时信用不足或假货的问题。
支持paypal用户付款,非paypal用户可以选择debit card 或者credit card付款方式,再进行宅配,线上购买三个工作日内送货上门。
5.redmart.com
7
Redmart和超市差不多,也是销售各种零售杂货,包括家居用品和蔬菜等。经常有各种折扣码和优惠,记得输。
6.sg.carousell.com
8
Carousell是一个C2C模式的移动购物APP,是新加坡最受欢迎的二手交易平台,从2012年成立以来,APP上已经上传了50万件商品,得到了来自日本乐天的80万美元投资,目前正准备扩张到马来西亚和印度尼西亚。
7.reebonz.com.sg
9
Reebonz主要销售打折奢侈品,比如高端手包、奢侈品旅行包、鞋子等。除了在线下单,Reebonz也经常举办线下的特卖会。
8. 1030am.com
10
成立于2015年的时尚闪购电商网站,网站域名寓意就是每天上午十点半都有低价折扣品牌商品上线。
网站走轻奢路线, 主打轻奢品牌包包,欧美日韩的化妆品。因为采用海外买手大宗采购模式,所以价格非常有竞争力。
1030AM刚推出不久就深受本地年轻人群的喜爱,因为这些包包和化妆品绝对是正品,而且价格基本都是本地最低的。
9.www.ezbuy.sg
11
作为完美主义强迫症的作者,本来想凑足十大电商就够了。但是,还有一个与上面完全不同的网站必须要提。从中国和美国代购的神器啊。
65代购是新加坡成立最早的专业代购公司,成立于2009年,至今已服务超过50万新加坡生活的朋友,可以帮全球购。从主攻淘宝到兼营美国代购,据说现在是几百人的大公司!据说新加坡眼上偶尔露面的一个低调美食作者在他们里面做程序猿(超级资深那种)。
10. PIABIA http://piabia.com.sg
其实这不是一个纯电商网站,但是能买到PIABIA独家最低价购买到的淘宝和京东上的商品。用户在PIABIA不仅能买到高性价比的衣物而且还能买到各种电子产品和玩具。PIABIA的APP也上线了,还能给新加坡三家电信公司的预付卡充值