left join on

SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

LEFT JOIN 关键字语法

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

原始的表 (用在例子中的):

“Persons” 表:

Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

“Orders” 表:

Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

左连接(LEFT JOIN)实例

现在,我们希望列出所有的人,以及他们的定购 – 如果有的话。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

发表在 基本语法 | 留下评论

linux下最大进程号

最近做一个项目,多进程脚本,grep了一下,发现进程号最大应该是65535或65536,和端口号最大数目是一致的。

发表在 linux | 留下评论

crontab中0/1/2信号都是干啥的

bash中0,1,2三个数字分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。第一个我也不知道是个啥

有几点需要注意的:

1、经常看到 2>&1 &。2>&1就是用来将标准错误2重定向到标准输出1中的。此处1前面的&就是为了让bash将1解释成标准输出而不是文件1。至于最后一个&,则是让bash在后台执行。但是不能写成2>>&1,这样crontab是不会运行的,至于为啥我也不知道。

下面有个demo,防止我们运行的时候出错:

crontab里面这么写:

*/1 * * * * export l_day=`date -d "-1 day" +\%Y-\%m-\%d` && cd /home/users/test/tmp/script/ && sh ./test.sh $l_day $l_day 1>>/home/users/test/tmp/script/log/test.log 2>&1 &

test.sh文件这么写:

#!/bin/bash
arg1=$1
arg2=$2
echo $arg1" <-> "$arg2

ok,就先这么记录着吧,折腾我好长时间。。。shit
发表在 bash | 留下评论

安装mysql

wget https://downloads.mysql.com/archives/get/file/mysql-5.7.16.tar.gz
cmake的时候还需要依赖 https://downloads.mysql.com/archives/get/file/mysql-boost-5.7.16.tar.gz

安装mysql,结果发现新版需要cmake,万幸,我的环境没有cmake,草。
先安装cmake吧,之前我记得安装过,百度一下,下载之前的安装包。
tar zxvf http://distfiles.macports.org/cmake/cmake-2.8.12.2.tar.gz
./bootstrap
make
make install
安装到make install这一步,估计是因为需要root权限吧
[ 2%] Built target cmIML_test
[ 5%] Built target cmsys
[ 5%] Built target cmsysTestDynload
[ 6%] Built target cmsys_c
[ 7%] Built target cmsysTestProcess
[ 7%] Built target cmsysTestSharedForward
[ 8%] Built target cmsysTestsC
[ 10%] Built target cmsysTestsCxx
[ 12%] Built target cmzlib
[ 24%] Built target cmcurl
[ 24%] Built target LIBCURL
[ 25%] Built target cmcompress
[ 26%] Built target cmbzip2
[ 47%] Built target cmlibarchive
[ 48%] Built target cmexpat
[ 56%] Built target cmForm
[ 79%] Built target CMakeLib
[ 83%] Built target CPackLib
[ 92%] Built target CTestLib
[ 95%] Built target ccmake
[ 95%] Built target cmake
[ 95%] Built target cpack
[ 96%] Built target ctest
[ 97%] Built target documentation
[ 98%] Built target CMakeLibTests
[ 99%] Built target runcompilecommands
[ 99%] Built target foo
[ 99%] Built target memcheck_fail
[ 99%] Built target pseudo_BC
[ 99%] Built target pseudo_purify
[100%] Built target pseudo_valgrind
[100%] Built target pseudonl_BC
[100%] Built target pseudonl_purify
[100%] Built target pseudonl_valgrind
Install the project...
-- Install configuration: ""
CMake Error at cmake_install.cmake:36 (FILE):
 file cannot create directory: /usr/local/doc/cmake-2.8. Maybe need
 administrative privileges.
make: *** [install] 错误 1
没事儿,据说CMake 可以在编译目录下运行,所以用的时候直接bin/cmake
/home/pay/local/cmake-2.8.12.2/bin/cmake . -DCMAKE_INSTALL_PREFIX=/home/pay/local/mysql56 \
-DSYSCONFDIR=/home/pay/local/mysql56 \
-DMYSQL_DATADIR=/home/pay/local/mysql56/data \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/home/pay/local/mysql56/tmp/mysql.sock \
-DMYSQL_USER=mysql
//设置目录所有者及所属组
chown -R pay:pay /home/pay/local/mysql56/
mkdir /home/pay/local/mysql56/data/
chown -R pay:pay /home/pay/local/mysql56/data/
//对数据库进行初始化 (高版本的5.7换成了mysqld --intialize,具体看错误提示)
/home/pay/local/mysql56/scripts/mysql_install_db --basedir=/home/pay/local/mysql56 --datadir=/home/pay/local/mysql56/data --user=pay --defaults-file=/home/pay/local/mysql56/my.cnf --explicit_defaults_for_timestamp
卧槽,FATAL ERROR: Could not find ./bin/my_print_defaults
主要看提示,人家说你是不是没make install啊,还真是,于是make install
//启动
sudo /Users/wenzg/local/mysql/bin/mysqld_safe --defaults-file=/Users/wenzg/local/mysql/my.cnf --pid-file=/Users/wenzg/local/mysql/data/local-dev.pid --user=mysql
注:如果端口冲突,可以在my.cnf里面改下端口
//检查服务是否启动
 //查看进程
 ps -le | grep mysqld
 //查看端口
 netstat -na | grep 3306
 //查看服务器版本
/home/pay/local/mysql56/bin/mysqladmin version
//设置管理员密码
/home/pay/local/mysql56/bin/mysql -u root
这里高版本的mysql5.7在启动时需要添加参数--skip-grant-tables,这样才能以root无密码方式登陆进去,添加密码后再重启mysql服务
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root';
 flush privileges;
5.7版本mysql.user表已经木有了password字段,改成了authentication_string,而且首次安装后授权的用户需要update授权表,不能grant命令,update mysql.user set authentication_string=PASSWORD("root") where user='root' and Host = 'localhost'; 
下面是对于mysql的简单设置,主要是开启常规日志、慢查询日志
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....
port = 7777
socket = /home/pay/local/mysql56/tmp/mysql.sock
#慢查询配置
slow_query_log = 'ON'
slow_query_log_file = '/home/pay/local/mysql56/data/slow_query.log'
long_query_time = 1
#日志配置
general_log = 'ON' 
general_log_file = '/home/pay/local/mysql56/data/mysql.log'
PS:这里日志如果被rm,自己手动touch的日志是不会生效的,需要在console中flush logs,会重新生成日志文件
#设置默认连接编码
character_set_server=latin1
发表在 mysql | 留下评论

查看linux版本

lsb_release -a

发表在 linux | 留下评论

预排序分类树算法(todo)

http://my.oschina.net/bootstrap/blog/166805

发表在 扒拉代码 | 留下评论

order by技巧(转载)

1. 只按日期排序,忽略年份
> select date, description from table_name order by month(date),dayofmonth(date);
注意:单纯使用dayofyear来排序会导致错误,如2-29与非闰年的3-1日同等级

 

2. 排序点分式IP
> select ip from table_name order by inet_aton(ip);
或者在设计表时就使用 int unsigned 来表示ip。

 

3. 将某列中特定值排在最前
例如想把表中lulu的名字排在最前显示,其他按字母排序
> select name from table_name order by if(name='lulu',0,1),name ;
也可以把if的条件根据需要换成相应的语句。

 

4. 将某列内容按照用户自定义的顺序排序
例如想把表中的名字按lulu,xixi,baba,mama的非常规顺序排序输出:
> select name from table_name order by field(name,'lulu','xixi','baba','mama');

 

5. 对枚举类型排序
枚举类型默认为数字排序,如果希望以字符串形式排序。
> select name from table_name order by cast(name as char);
如果希望更改enum的排序默认顺序,可以alter table
alter table table_name modify name enum('lulu','xixi','mama','baba');

 


6. 按csv类型的字符串的某字串排序
例如某列m_str内容是形如abc-321-mno-jkl的形式,希望对第二列进行排序
> select m_str from table_name
order by substring_index(substring_index(m_str,'-',2),'-',-1);
发表在 mysql | 留下评论

get_magic_quotes_gpc() 转义技巧

get_magic_quotes_gpc()

 

这个应该算是个常识性问题了,php5.4之前这个函数返回默认值是 1,之后就0了,也就是说php5.4之后,php不会给你传递的$_GET、$_POST、$_COOKIE、$_REQUEST变量自动转义了。

这里的转义意思是主要是:反斜线(\)、单引号(’)、双引号(”)、NUL(这个我没复现过,估计用js可以实现吧)

 

Note:

如果 magic_quotes_sybase 也是 ON,它会完全覆盖 magic_quotes_gpc。 两个指令都启用意味着只有单引号被转义为 。 双引号、反斜杠和 NUL’s 不会被转义。 如果启用了magic_quotes_sybase单引号会被单引号转义而不是反斜线

 

所以,如果需要对所有的字符字符进行过滤的话,有个好办法:

 

<?php
/**
 * This setting was removed in PHP 5.4, but get_magic_quotes_gpc
 * always returns False since then.
 * 自动给加转义
 */
define( 'QUOTES_GPC', get_magic_quotes_gpc() );
define( 'QUOTES_SYBASE', ini_get( 'magic_quotes_sybase' ) );
if ( QUOTES_GPC && QUOTES_SYBASE || !QUOTES_GPC) {
 PMA_arrayWalkRecursive($_GET, 'addslashes', true);
 PMA_arrayWalkRecursive($_POST, 'addslashes', true);
 PMA_arrayWalkRecursive($_COOKIE, 'addslashes', true);
 PMA_arrayWalkRecursive($_REQUEST, 'addslashes', true);
}
echo $_GET['s'];
function PMA_arrayWalkRecursive(& $array, $function, $apply_to_keys_also = false)
{
 static $recursive_counter = 0;
 $walked_keys = array();
if (++$recursive_counter > 1000) {
 die('possible deep recursion attack');
 }
 foreach ($array as $key => $value) {
 if (isset($walked_keys[$key])) {
 continue;
 }
 $walked_keys[$key] = true;
if (is_array($value)) {
 PMA_arrayWalkRecursive($array[$key], $function, $apply_to_keys_also);
 } else {
 $array[$key] = $function($value);
 }
if ($apply_to_keys_also && is_string($key)) {
 $new_key = $function($key);
 if ($new_key != $key) {
 $array[$new_key] = $array[$key];
 unset($array[$key]);
 $walked_keys[$new_key] = true;
 }
 }
 }
 $recursive_counter--;
}

							
发表在 php, 扒拉代码 | 留下评论

jsonp的小demo

jsonp.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset='UTF-8' />
<!-- demo1
<script type="text/javascript">
 var localHandler = function(data){
 alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
};
</script>
<script type="text/javascript" src="http://2.wenzg.applinzi.com/remote.js"></script>
-->
<!-- demo2
<script type="text/javascript">
// 得到航班信息查询结果后的回调函数
var flightHandler = function(data){
 alert('你查询的航班结果是:航班号 '+ data.code +', 票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
};
// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
var url = "http://2.wenzg.applinzi.com/remote.php?callback=flightHandler";
// 创建script标签,设置其属性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script标签加入head,此时调用开始
document.getElementsByTagName('head')[0].appendChild(script);
</script>
-->
<!-- demo3 -->
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
 $.ajax({
 type: "get",
 async: false,
 url: "http://2.wenzg.applinzi.com/remote.php",
 dataType: "jsonp",
 jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
 jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
 success: function(data){
 alert('你查询的航班结果是:航班号 '+ data.code +', 票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
 },
 error: function(){
 alert('fail');
 }
 });
});
</script>
</head>
<body>
</body>
</html>

remote.php

<?php
if(isset($_GET['callback'])){
 $json = '{"code": "CA1998","price": 1780,"tickets": 5}';
 echo "flightHandler($json);";
}

remote.js
localHandler({"result":"我是远程js带来的数据"});


转载自:http://blogread.cn/it/article/7122
发表在 跨域解决方案 | 留下评论

find命令

查找大于10M的文件
find / -type f -size +10000000c -exec du -sh {} \;
递归检查指定目录下php文件是否无语法错误
find ./ -type f -name '*.php' -exec php -ln {} \;

来自: http://man.linuxde.net/find

注:-name 模糊匹配的时候要加引号 不然有问题

发表在 linux | 留下评论