用DISTINCT调用两个mysql表

时间:2017-10-10 18:44:00

标签: php mysql

这是我正在进行的其他项目的内部/学习/基础。

我有一个包含多个表的mysql数据库,但主要是我使用其中两个表; links_sp和link_fields_sp。

我正在使用看起来像这样的php脚本搜索链接。

$query = "SELECT * FROM links_sp WHERE status='active' AND type='shopping' AND language='en' AND MATCH(link_url,link_title,link_keywords,link_details) AGAINST (? IN BOOLEAN MODE) $order_clause";

搜索如下:

  1. ebay.com,笔记本电脑,索尼,15英寸

  2. ebay.com,笔记本电脑,东芝,15英寸

  3. bestbuy.com,笔记本电脑,索尼,15英寸

  4. ebay.com,笔记本电脑,戴尔,15英寸

  5. amazon.com,笔记本电脑,索尼,15英寸

  6. 等等。

    工作完美而简单,但我想要的是将DISTINCT与url主机一起使用,因此它只显示一个主机的一个结果:

    1. ebay.com,笔记本电脑,索尼,15英寸
    2. bestbuy.com,笔记本电脑,索尼,15英寸
    3. amazon.com,笔记本电脑,索尼,15英寸 等等..
    4. 我在url_host列下的link_fields_sp表中的link_url列和url主机下的links_sp表中存储url。此外,每个链接在其他表中都有link_id列和相同的id。

      我试过了:

      $query = "SELECT DISTINCT * FROM (SELECT * FROM links_sp WHERE status='active' AND type='shopping' AND language='en' AND MATCH(link_url,link_title,link_keywords,link_details) UNION ALL SELECT * FROM link_fields_sp MATCH(url_host)) AGAINST (? IN BOOLEAN MODE) $order_clause";
      

      但我做错了。

      感谢任何输入。 谢谢。

1 个答案:

答案 0 :(得分:2)

" SELECT DISTINCT"在整个行中运行,任何列位置的微小差异都可能导致行被认为与其他行不同。这3行是" distinct":

ebay.com, laptop, sony, 15 inch
ebay.com, laptop, toshiba, 15 inch
ebay.com, laptop, dell, 15 inch

NB。在select distinct *中使用*会减少行数减少的可能性,因为对于每个添加的列,引入差异的可能性更大。相比之下,以下将减少行数:

Select distinct domain from table

GROUP BY 是替代方案,使用它可以打开更多选项。但即便如此,您还需要考虑如何汇总数据。

最初MySQL默认使用语法的非标准方法,其中允许在select子句中包含许多列,但在group by子句中列出的更少(例如,select子句中的20列,但组中只有1列by clause)。 e.g。

## non-standard sql syntax in MySQL
select   domain, type, supplier, size from table
group by domain

但请仔细考虑一下:只要type, supplier, size中有多个值,此查询会执行什么操作?这些列中的结果是"不确定" (如果您使用这种非标准方法,那么您在这些专栏中看不到明确的逻辑)。

相比之下,SQL标准要求每个"非聚合"选择列表的列也列在group by子句中。 e.g。

## standard sql syntax for group by clause
select   domain, type, supplier, size from table
group by domain, type, supplier, size

(该示例产生与select distinct相同的结果)

因此,使用group by来实现更少的行数,但是使用了一些"逻辑"应用于其他列,您可以执行以下操作:

## standard sql syntax
select   domain, max(type), max(supplier), max(size) from table
group by domain

然而,虽然这会减少行数,但其他列有些随意,满足MAX()条件的值可能不会来自相同的行。这是一个相当大的挑战,因为它很容易减少行数,但同时使其他列有用。

在MySQL中,克服这一困难的常用技巧是使用GROUP_CONCATCONCAT()GROUP_GONCAT() 的组合查看查询6& 下面的

SQL Fiddle

<强>设置

CREATE TABLE Table1
    (`domain` varchar(11), `type` varchar(6), `supplier` varchar(7), `size` varchar(7))
;

INSERT INTO Table1
    (`domain`, `type`, `supplier`, `size`)
VALUES
    ('ebay.com', 'laptop', 'sony', '15 inch'),
    ('ebay.com', 'laptop', 'toshiba', '15 inch'),
    ('bestbuy.com', 'laptop', 'sony', '15 inch'),
    ('ebay.com', 'laptop', 'dell', '15 inch'),
    ('amazon.com', 'laptop', 'sony', '15 inch')
;

查询1

select distinct * from table1

<强> Results

|      domain |   type | supplier |    size |
|-------------|--------|----------|---------|
|    ebay.com | laptop |     sony | 15 inch |
|    ebay.com | laptop |  toshiba | 15 inch |
| bestbuy.com | laptop |     sony | 15 inch |
|    ebay.com | laptop |     dell | 15 inch |
|  amazon.com | laptop |     sony | 15 inch |

查询2

select distinct domain from table1

<强> Results

|      domain |
|-------------|
|    ebay.com |
| bestbuy.com |
|  amazon.com |

查询3

## non-standard sql syntax in MySQL
select   domain, type, supplier, size from table1
group by domain

<强> Results

|      domain |   type | supplier |    size |
|-------------|--------|----------|---------|
|  amazon.com | laptop |     sony | 15 inch |
| bestbuy.com | laptop |     sony | 15 inch |
|    ebay.com | laptop |     sony | 15 inch |

查询4

## standard sql syntax for group by clause
select   domain, type, supplier, size from table1
group by domain, type, supplier, size

<强> Results

|      domain |   type | supplier |    size |
|-------------|--------|----------|---------|
|  amazon.com | laptop |     sony | 15 inch |
| bestbuy.com | laptop |     sony | 15 inch |
|    ebay.com | laptop |     dell | 15 inch |
|    ebay.com | laptop |     sony | 15 inch |
|    ebay.com | laptop |  toshiba | 15 inch |

查询5

## standard sql syntax
select   domain, max(type), max(supplier), max(size) from table1
group by domain

<强> Results

|      domain | max(type) | max(supplier) | max(size) |
|-------------|-----------|---------------|-----------|
|  amazon.com |    laptop |          sony |   15 inch |
| bestbuy.com |    laptop |          sony |   15 inch |
|    ebay.com |    laptop |       toshiba |   15 inch |

查询6

## use group_concat
select   domain, group_concat(type), group_concat(supplier), group_concat(size) from table1
group by domain

<强> Results

|      domain |   group_concat(type) | group_concat(supplier) |      group_concat(size) |
|-------------|----------------------|------------------------|-------------------------|
|  amazon.com |               laptop |                   sony |                 15 inch |
| bestbuy.com |               laptop |                   sony |                 15 inch |
|    ebay.com | laptop,laptop,laptop |      sony,toshiba,dell | 15 inch,15 inch,15 inch |

查询7

## use both concat and group_concat
select
       domain
     , group_concat(concat('[',type,',',supplier,',',size,']')) type_supplier_size
from table1
group by domain

<强> Results

|      domain |                                                   type_supplier_size |
|-------------|----------------------------------------------------------------------|
|  amazon.com |                                                [laptop,sony,15 inch] |
| bestbuy.com |                                                [laptop,sony,15 inch] |
|    ebay.com | [laptop,sony,15 inch],[laptop,toshiba,15 inch],[laptop,dell,15 inch] |