外连接子查询最常见的植物物种

雕刻师
MySQL 5.5.43

我正在研究7200种大麻菌株的数据库,需要显示菌株列表以及其育种者声称的最受欢迎的物种。

该主题非常令人困惑,因此以下一些事实将帮助您了解我的困惑所在:

  • 每个大麻株是以下物种之一;,苜蓿或Ruderalis,也可以是三者的杂交。
  • 流行菌株可能有多达30个不同的育种者生产这种菌株的种子。
  • 该菌株的每个育种者的杂交/遗传可能略有不同,并且报告的物种也不同。例如:Breeder1声称StrainX是100%的d稻,而Breeder2声称StrainX是大部分的d(可能是90%In和10%苜蓿)。显然,苜蓿植物的效果令人振奋,而In稻的效果却有些低落,因此记录每个品种的细微差异以达到药用目的非常重要。

示例应变:

对于一种非常受欢迎的菌株White Widow,这是我产生的结果集。它有29个不同的育种者,每个育种者声称拥有不同的物种。从结果中可以看到,此菌株最流行的物种是In /苜蓿(同等杂种)。

SELECT
  s.id,
  b.id AS breederID,
  b.breederName AS breederName,
  GROUP_CONCAT(DISTINCT sp.species ORDER BY sp.species ASC SEPARATOR '/') AS species
FROM strains AS s
LEFT JOIN strainBreedersDir AS sbd ON s.id = sbd.strainID
LEFT JOIN breeders AS b ON sbd.breederID = b.id
LEFT JOIN strainBreederSpeciesDir AS sbsd ON s.id = sbsd.strainID AND sbd.breederID = sbsd.breederID
LEFT JOIN species AS sp ON sbsd.speciesID = sp.id
WHERE s.id = 6782
GROUP BY s.id, sbd.breederID

数据库结果集

我想要的结果

我想显示一个品系名称列表,然后在每个名称旁边显示一个育种者列表,以及所有育种者最受欢迎的/平均声称的物种因此,正如我之前向您展示的,育种者为此菌株记录的最受欢迎的物种是印度In /苜蓿,并希望这样显示:

strainID  | strainName      | breeders                 | averageSpecies
--------------------------------------------------------------------------
6782      | White Widow     | Green House Seeds,       | Indica/Sativa
          |                 | Barney's Farm

我尝试过的是:

我没有在每个物种旁边显示最受欢迎的物种,而是在每个物种旁边显示了记录物种的第一个实例。我以为这样就足够了,但是一个物种的第一个实例可能是空的,因为目前大约有100个未知物种的菌株。因此,我不希望某个物种的第一个实例是“未知的”,因为实际上该菌株的其他育种者知道其中的物种。因此,我认为最好是确定记录最多的物种并显示出来。到目前为止,这是我必须去的地方:

SELECT
  s.id,
  s.strainName,
  GROUP_CONCAT(DISTINCT b.breederName ORDER BY b.breederName ASC separator ', ') AS breeders,
  COALESCE(NULLIF(ps.primarySpecies,''),'Unknown') AS primarySpecies
FROM strains AS s
LEFT JOIN strainBreedersDir AS sbd ON s.id = sbd.strainID
LEFT JOIN breeders AS b ON sbd.breederID = b.id
LEFT OUTER JOIN (
  SELECT
    sbd.breederID AS breederID,
    GROUP_CONCAT(DISTINCT sp.species ORDER BY sp.species ASC SEPARATOR '/') AS primarySpecies
  FROM strains AS s
  LEFT JOIN strainBreedersDir AS sbd ON s.id = sbd.strainID
  LEFT JOIN strainBreederSpeciesDir AS sbsd ON s.id = sbsd.strainID AND sbd.breederID = sbsd.breederID
  LEFT JOIN species AS sp ON sbsd.speciesID = sp.id
  GROUP BY s.id, sbd.breederID
) AS ps ON sbd.breederID = ps.breederID
WHERE s.id = 6782
GROUP BY s.id

结果

id   | strainName   | breeders           | species
----------------------------------------------------------
6782 | White Widow  | Green House Seeds, | Indica/Sativa
     |              | Barney's Farm      |

但是我无法弄清楚如何修改OUTER JOIN来显示最受欢迎的物种,而不仅仅是第一行。我尝试了许多不同的外部联接查询变体,但都失败了很多,而对所尝试的方法却一无所知。

如何显示最受欢迎的物种?

数据库结构:

strains

id (PK AUTO)     |  strainName (UNIQUE)
---------------------------------------------
6782             |  White Widow

-

strainBreedersDir

strainID (FK UNIQUE)     | breederID (UNIQUE)
---------------------------------------------
6782                     | 16
6782                     | 23

-

breeders

id (PK AUTO)      | breederName (UNIQUE)
---------------------------------------------
16                | Green House Seeds
23                | Barney's Farm

-

strainBreederSpeciesDir

strainID (FK UNIQUE)  | breederID (INT UNIQUE)  | speciesID (INT UNIQUE)
----------------------------------------------------------------------
6782                  | 16                      | 1
6782                  | 16                      | 2
6782                  | 23                      | 5

-

species

id (PK AUTO)  | species (UNIQUE)
-------------------------------------
1             | Indica
2             | Sativa
3             | Ruderalis
4             | Mostly Indica
5             | Mostly Sativa
6             | Mostly Ruderalis

这是一个SQLFIDDLE-由Juan Carlos Oropeza提供。

保罗·斯坦利

我不了解您要从工作查询中汇总的知识。

ID可能以不同的方式执行此操作,但是由于我没有更改您的工作查询,因此可能会为您提供所需的信息。子查询的出现GROUP_CONCAT使事情变得有些棘手,因为我们正在指望那个领域,而我不能直接把它放在那儿(除非有人可以向我展示更好的方法),然后我从中选择aMAXAVG您可以切换MAXAVG

SELECT MAX(aggregated.theCount),
aggregated.id,
aggregated.breederID,
aggregated.breeders as mostPopularBreeders,
aggregated.species as mostPopularSpecies,
AllStrainBreeders.allBreeders as strainBreeders
      FROM(
    SELECT 
        speciesWithBreeder.id,
        speciesWithBreeder.breederID,
        speciesWithBreeder.breederName,
        GROUP_CONCAT(DISTINCT speciesWithBreeder.breederName ORDER BY speciesWithBreeder.breederName ASC separator ', ') AS breeders,
        speciesWithBreeder.species,
        COUNT(*) as theCount
    FROM(
        SELECT
          s.id,
          b.id AS breederID,
          b.breederName AS breederName,
          GROUP_CONCAT(DISTINCT sp.species ORDER BY sp.species ASC SEPARATOR '/') AS species
        FROM strains AS s
        LEFT JOIN strainBreedersDir AS sbd ON s.id = sbd.strainID
        LEFT JOIN breeders AS b ON sbd.breederID = b.id
        LEFT JOIN strainBreederSpeciesDir AS sbsd ON s.id = sbsd.strainID AND sbd.breederID = sbsd.breederID
        INNER JOIN species AS sp ON sbsd.speciesID = sp.id
        WHERE s.id = 6782
        GROUP BY s.id, sbd.breederID) 
    AS speciesWithBreeder
GROUP BY speciesWithBreeder.species
ORDER BY COUNT(*) DESC
  ) as aggregated 
  LEFT JOIN(
    SELECT 
    sbd.strainID,
    GROUP_CONCAT(DISTINCT b.breederName ORDER BY b.breederName ASC SEPARATOR ',') AS allBreeders
    FROM breeders b  
    LEFT JOIN strainBreedersDir sbd ON sbd.breederID = b.id AND sbd.strainID = 6782
    GROUP BY sbd.strainID
   ) as AllStrainBreeders      
   ON aggregated.id = AllStrainBreeders.strainID
GROUP BY aggregated.id

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

子列表中最常见的值

来自分类Dev

SQL 连接子查询 where 条件

来自分类Dev

SQL多表连接子查询

来自分类Dev

使用自连接子查询更新

来自分类Dev

XSL最常见

来自分类Dev

Neo4J查询最常见的关系

来自分类Dev

给定大量数据,查找最常见的查询

来自分类Dev

(Impala) 在字段中选择最常见的值会导致“选择列表中不支持子查询”

来自分类Dev

MySQL左连接子查询null连接

来自分类Dev

最常见的数组元素

来自分类Dev

具有多个条件的 Oracle SQL 连接子查询

来自分类Dev

从内连接子查询中选择前 1 个

来自分类Dev

mysql - 使用子查询连接子查询,其中条件使用主查询字段

来自分类Dev

在给定的字符串中找到最常见的子字符串?重叠是允许的

来自分类Dev

在字符串列表中找到最常见的子字符串?

来自分类Dev

从文件中获取N个最常见的子字符串

来自分类Dev

从字符串数组中查找最常见的子字符串

来自分类Dev

PHP:数组中最常见的值

来自分类Dev

SQLite如何查找最常见的值

来自分类Dev

使用LINQ查找最常见的单词

来自分类Dev

计算最常见的数组元素

来自分类Dev

查找最常见的财产-密码

来自分类Dev

熊猫系列最常见的元素

来自分类Dev

获取mysql中最常见的值

来自分类Dev

查找最常见的哈希值

来自分类Dev

在R中找到最常见的路径

来自分类Dev

最常见的不同值mongodb

来自分类Dev

MySQL ORDER BY不是最常见的

来自分类Dev

Java中最常见的价值