2015-10-23 2 views
4
MySQL 5.5.43 

растительного Я работаю на базе 7.200 штаммов каннабиса и нужно отобразить список штаммов, наряду с наиболее популярными заявляемыми видами по их заводчикам.Outer присоединиться к подзапросу самого популярного появления вида

Субъект довольно запутанным, так вот несколько фактов, которые помогут вам понять, где моя путаница заключается:

  • Каждый штамм каннабис является один из следующих видов; Indica, Sativa или Ruderalis, или это может быть крест из всех трех.
  • У популярных штаммов может быть до 30 различных селекционеров, производящих семена этого штамма.
  • Каждый заводчик этого одного штамма может иметь несколько разные кресты/генетику и сообщать о разных видах. Например: Breeder1 утверждает, что StrainX - это 100% заявка Indica и Breeder2. StrainX - это преимущественно Indica (возможно, 90% Indica и 10% Sativa). По-видимому, влияние растения Sativa поднимает настроение, а Indica немного удручает, поэтому очень важно регистрировать небольшие различия в каждой породе в лечебных целях.

Пример РАСА:

Для одного очень популярного штамма под названием White Widow, это результирующий набор я продюсировал. У этого есть 29 различных селекционеров с каждым селекционером, претендующим на различные виды. Как видно из результатов, наиболее популярным видом этого штамма является Indica/Sativa (равный гибрид).

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 

Database result set

РЕЗУЛЬТАТ Я ХОЧУ

Я хотел бы показать список имен деформаций и рядом с каждой из них я хотел бы показать список заводчиков и наиболее популярные/средние заявленные виды всеми заводчиками. Так что, как я показал ранее, наиболее популярные виды, селекционеры для этого штамма является Indica/Sativa, и хотели бы это показано, как это:

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 

HERE IS AN SQLFIDDLE - любезно Хуана Карлоса Оропеза.

+0

Abba Zabba, ты мой единственный друг! – Jim

+0

Мне понадобятся некоторые данные * образца * для проверки моего запроса. –

+1

[SQLFiddle] (http://sqlfiddle.com) поможет нам. Никто не любит создавать таблицы и настраивать тестовые данные, чтобы мы могли тестировать запросы, чтобы они работали. Для тебя. –

ответ

1

Я ухожу от знания того, что вы хотите заполнить свой рабочий запрос.

Id, вероятно, делает это по-другому, но поскольку я не изменяю ваш рабочий запрос, это может дать вам то, что вы хотите. Подзапросы появляются, поскольку GROUP_CONCAT делает вещи немного более жесткими, так как мы рассчитываем на это поле, и я не могу вставить счет прямо там (если кто-то не сможет показать мне лучший способ). Затем я выбираю MAX или AVG. что. Вы можете отключить MAX для AVG.

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 
+0

Большое спасибо! Я должен был внести некоторые коррективы, чтобы заставить его работать. Результаты очень близки, но не совсем корректны. Это создает несколько строк для каждого штамма, где, если я забрал «where s.id = 6782», чтобы перечислить все штаммы, я бы хотел, чтобы один ряд за одно напряжение имел наиболее популярное поле вида, заполненное, как есть, но полем заводчиков нужны все имена селекционеров, разделенные запятыми, независимо от того, зарегистрированы они или нет. Какие-либо предложения? http://sqlfiddle.com/#!9/9e4fd4/5 – TheCarver

+0

Мне удалось немного приблизиться к моим пожеланиям, изменив предложение группы по основному запросу. Я изменил 'GROUP BY speciesWithBreeder.species' на' GROUP BY speciesWithBreeder.id'. У меня теперь есть один ряд для каждого штамма, как я желал, и у меня также есть список имен селекционеров с разделителями-запятыми, как я хотел, и я также вид. Единственное, что сейчас неправильно, это поле счетчика. Не обязательно возвращать счет, но я надеялся, что вы сможете убедиться, что счет все еще работает нормально, что выбирает самые популярные виды? Если это так, я готов пойти: http://sqlfiddle.com/#!9/9e4fd4/9 – TheCarver

+0

Хорошо, что с тобой сейчас, дай мне несколько минут. –

Смежные вопросы