这是我正在进行的其他项目的内部/学习/基础。
我有一个包含多个表的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";
搜索如下:
ebay.com,笔记本电脑,索尼,15英寸
ebay.com,笔记本电脑,东芝,15英寸
bestbuy.com,笔记本电脑,索尼,15英寸
ebay.com,笔记本电脑,戴尔,15英寸
amazon.com,笔记本电脑,索尼,15英寸
等等。
工作完美而简单,但我想要的是将DISTINCT与url主机一起使用,因此它只显示一个主机的一个结果:
我在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";
但我做错了。
感谢任何输入。 谢谢。
答案 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_CONCAT
或CONCAT()
与GROUP_GONCAT()
的组合查看查询6& 下面的
<强>设置强>:
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] |