【问题标题】:Select from table where there's multiple entries in one row从一行中有多个条目的表中选择
【发布时间】:2012-04-06 22:08:05
【问题描述】:

我有一些类似的 MySQL 表:

ids            urns             urn_urls     urls
id | type    id | uid | urn    uid | lid    lid | url
---+-----    ---+-----+-----   ----+----    ----+----
1  | 1        1 | 1   | urn1    1  |  1       1 | url1
2  | 4        2 | 2   | urn2    1  |  2       2 | url2      
3  | 4        2 | 3   | urn3    2  |  3       3 | url3
4  | 4        3 | 4   | urn4    2  |  4       4 | url4
...|...       3 | 5   | urn5    3  |  4       5 | url5
.             4 | 6   | urn6    4  |  5       6 | url6
.            ...| ... | ...     5  |  5      ...| ...
.                               6  |  1
.                               6  |  6

我想要的是一个查询,它列出了类型 4 的那些 id 条目,这些条目与多个瓮和对应的瓮相关,如下所示:

result
id | url
---+-----
2  | url3
2  | url4
4  | url1
4  | url6

我已经尝试过这样的事情:

SELECT id,url 
  FROM ids 
  NATURAL JOIN urns 
  NATURAL JOIN urn_urls 
  NATURAL JOIN urls 
  WHERE type=4 
  HAVING count( #column# )>1;

使用#column# 之一(idlidurl),但它只返回行; 当我添加 GROUP BY 声明时,我得到了更多,但不是适当的结果

SELECT id,url 
  FROM ids 
  NATURAL JOIN urns 
  NATURAL JOIN urn_urls
  NATURAL JOIN urls 
  WHERE type=4 
  GROUP BY #group# 
  HAVING count( #column# )>1;

对于#group# / #column# 的不同组合(idlidurl)。

因此,感谢您的帮助。

【问题讨论】:

  • 为什么urn1 应该出现在结果中?它连接到 id 1,其类型为 1,而不是 4。
  • 我的错。结果应该包含网址;)我会编辑这个

标签: mysql select count conditional-statements having


【解决方案1】:

怎么样-

SELECT id, GROUP_CONCAT(urls.url SEPARATOR ' ')
FROM ids 
NATURAL JOIN urns 
NATURAL JOIN urn_urls
NATURAL JOIN urls 
WHERE type=4 
GROUP BY ids.id 
HAVING COUNT(DISTINCT urls.url)>1;

【讨论】:

  • 几乎是我想要的。如果可以通过空格作为分隔符连接(因为冒号也可能是 url 的一部分),这可能会起作用。更好的是在我的示例中每个网址都有结果行。
  • 您可以使用任何您喜欢的分隔符 - GROUP_CONCAT()。另外请注意,返回值的长度受group_concat_max_len的限制
  • 我用我的示例对此进行了测试,并注意到这将返回以下内容:
    2 | url3 url4
    3 | url5 url5
    4 | url1 url6
    所以,我实际上不想要的是 id=3,因为它只与一个 url 相关(两次)
  • 您可以将 DISTINCT 添加到 COUNT - COUNT(DISTINCT urls.url)
  • 好的,所以 SELECT id, GROUP_CONCAT(urls.url SEPARATOR ' ') FROM ids NATURAL JOIN urns NATURAL JOIN urn_urls NATURAL JOIN urls WHERE type=4 GROUP BY ids.id HAVING COUNT(DISTINCT urls.url )>1;有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多