sphinx实现联合查询几个例子

记得以前sphinx是不支持联合查询的,第一次接触sphinx,好像2010年初的时候,当时写过一篇关于sphinx安装的文章。sphinx mmseg mysql 中文分词,下面举例说明,sphinx的联合查询用法。

一,添加二张测试表和数据

 代码如下 复制代码
1,users表和数据
mysql> desc users;  
+----------+-------------+------+-----+---------+----------------+  
| Field | Type | Null | Key | Default | Extra |  
+----------+-------------+------+-----+---------+----------------+  
| user_id | int(11) | NO | PRI | NULL | auto_increment |  
| username | varchar(20) | NO | | NULL | |  
+----------+-------------+------+-----+---------+----------------+  
2 rows in set (0.00 sec)  
  
mysql> select * from users;  
+------------+------------+  
| user_id | username |  
+------------+------------+  
| 1311895262 | 张三 |  
| 1311895263 | tank张二 |  
| 1311895264 | tank张一 |  
| 1311895265 | tank张 |  
+------------+------------+  
4 rows in set (0.00 sec)  
 2,orders表和数据
mysql> desc orders;  
+--------------+-------------+------+-----+---------+----------------+  
| Field | Type | Null | Key | Default | Extra |  
+--------------+-------------+------+-----+---------+----------------+  
| id | int(11) | NO | PRI | NULL | auto_increment |  
| user_id | int(11) | NO | | NULL | |  
| create_time | datetime | NO | | NULL | |  
| product_name | varchar(20) | NO | | NULL | |  
| summary | text | NO | | NULL | |  
+--------------+-------------+------+-----+---------+----------------+  
5 rows in set (0.00 sec)  
  
mysql> select * from orders;  
+----+------------+---------------------+----------------+--------------+  
| id | user_id | create_time | product_name | summary |  
+----+------------+---------------------+----------------+--------------+  
| 9 | 1311895262 | 2014-08-01 00:24:54 | tank is 坦克 | 技术总监 |  
| 10 | 1311895263 | 2014-08-01 00:24:54 | tank is 坦克 | 技术经理 |  
| 11 | 1311895264 | 2014-08-01 00:24:54 | tank is 坦克 | DNB经理 |  
| 12 | 1311895265 | 2014-08-01 00:24:54 | tank is 坦克 | 运维总监 |  
+----+------------+---------------------+----------------+--------------+  
4 rows in set (0.00 sec)  

二,配置sphinx.conf

 代码如下 复制代码
source order  
{  
 type = mysql  
 sql_host = localhost  
 sql_user = root  
 sql_pass =  
 sql_db = test  
 sql_query_pre = SET NAMES utf8  
 sql_query = \  
 SELECT a.id, a.user_id,b.username, UNIX_TIMESTAMP(a.create_time) AS create_time, a.product_name, a.summary \  
 FROM orders a left join users b on a.user_id = b.user_id  
 sql_attr_uint = user_id  
 sql_field_string = username  
 sql_field_string = product_name  
 sql_attr_timestamp = create_time  
 sql_ranged_throttle = 0  
 sql_query_info = SELECT * FROM orders WHERE id=$id  
}  
  
index myorder  
{  
 source = order  
 path = /usr/local/sphinx/var/data/myorder  
 docinfo = extern  
 mlock = 0  
 morphology = none  
 min_word_len = 1  
 charset_dictpath = /usr/local/mmseg3/etc/  
 charset_type = zh_cn.utf-8  
 ngram_len = 0  
 html_strip = 0  
}  

注意:在这里a.user_id = b.user_id,等号二边一定要有空格,不然就会报错。
三,重启sphinx

 代码如下 复制代码
# pkill searchd  
# /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all  
# /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf  

四,测试sphinx

 代码如下 复制代码

[root@localhost etc]# mysql -h 127.0.0.1 -P 9306                     //登录sphinx,9306端口,不是真实的mysql  
Welcome to the MySQL monitor. Commands end with ; or \g.  
Your MySQL connection id is 1  
Server version: 1.11-id64-dev (r2540)  
  
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.  
  
Oracle is a registered trademark of Oracle Corporation and/or its  
affiliates. Other names may be trademarks of their respective  
owners.  
  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  
  
mysql> select * from myorder where match('张');  
+------+--------+------------+------------+-------------+----------------+  
| id | weight | user_id | username | create_time | product_name |  
+------+--------+------------+------------+-------------+----------------+  
| 9 | 1304 | 1311895262 | 张三 | 1406823894 | tank is 坦克 |  
| 10 | 1304 | 1311895263 | tank张二 | 1406823894 | tank is 坦克 |  
| 11 | 1304 | 1311895264 | tank张一 | 1406823894 | tank is 坦克 |  
| 12 | 1304 | 1311895265 | tank张 | 1406823894 | tank is 坦克 |  
+------+--------+------------+------------+-------------+----------------+  
4 rows in set (0.01 sec)  
  
mysql> select * from myorder where match('张三');  
+------+--------+------------+----------+-------------+----------------+  
| id | weight | user_id | username | create_time | product_name |  
+------+--------+------------+----------+-------------+----------------+  
| 9 | 2500 | 1311895262 | 张三 | 1406823894 | tank is 坦克 |  
+------+--------+------------+----------+-------------+----------------+  
1 row in set (0.00 sec) 

mysql数据库中左连接,右连接,内链接详解介绍

一般所说的左连接,外连接是指左外连接,右外连接。做个简单的测试你看吧。
先说左外连接和右外连接:

 代码如下 复制代码

[TEST1@orcl#16-12月-11] SQL>select * from t1;

        ID NAME
---------- --------------------
         1 aaa
         2 bbb

[TEST1@orcl#16-12月-11] SQL>select * from t2;

        ID        AGE
---------- ----------
         1         20
         3         30
左外连接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 left join t2 on t1.id=t2.id;

        ID NAME                         ID        AGE
---------- -------------------- ---------- ----------
         1 aaa                           1         20
         2 bbb
右外连接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 right join t2 on t1.id=t2.id;

        ID NAME                         ID        AGE
---------- -------------------- ---------- ----------
         1 aaa                           1         20
                                         3         30

从上面的显示你可以看出:左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。如果没有匹配的id,比如说t1中id为2的t2中就没有。那边就以null显示。
右外连接过程正好相反。

再看内连接(也称为等值连接):

 代码如下 复制代码

[TEST1@orcl#16-12月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id;

        ID NAME                         ID        AGE
---------- -------------------- ---------- ----------
         1 aaa                           1         20

看到没有?  只有一条记录。内连接就是只取出符合过滤条件的记录 也就是t1.id=t2.id  那么符合t1.id=t2.id的记录只有id=1这一条,所以只显示一条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。

上条sql语句等价于:

 代码如下 复制代码

select * from t1,t2 where t1.id = t2.id

补充说明:

1、内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。   
    
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。     
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     
1)LEFT  JOIN或LEFT OUTER JOIN     
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       
2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。       
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。  

3、交叉联接   
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。    
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。

猜你喜欢

转载自blog.csdn.net/qiuyu6958334/article/details/82498967