SQL-запрос (pl / sql) для сложной логики - PullRequest
1 голос
/ 20 января 2011

Я застрял с этой проблемой на некоторое время. Сначала я объясню структуру таблицы

В моей системе четыре таблицы

Домен

Columns: 
      DomainID (primary key)
      DomainName

 Data:
        DomainID  DomainName
      1000        Google.com
      2000        mySql.com

WebPage

 Columns:
      WebpageID   (primary key)
      WebpageName
      DomainID   (FK from domain table)
 Data:
    5001   SearchPage.html   1000
    5002   Welcome.html      1000
    5003   ContactUs.htm     1000
    5004   AboutUs.html      1000

PluginType (PluginsType, который можно добавить на веб-страницу) В этой таблице перечислены типы плагинов, доступные для каждого домена

  Columns: 
         PluginType     (primary key)
         DomainID       (primary key)
         PluginTypeName  

   Data
        PluginTypeID        DomainID        PluginTypeName
         8000                 1000             searchButton
         8001                 1000             DropDownMenu
         8002                 1000             InteractiveForm
         8003                 1000             loginForm
         8004                 1000             LogoutForm

Плагин: Каждая веб-страница в домене может использовать любое количество плагинов.

      Columns:
             PluginID     (primary key)
             WebpageID    (FK from webpage table)
             pluginTypeID (FK from plugintype table)

      Data:
         pluginID        WebpageID(Name)         PluginTypeID
          10001             5001(SearchPage.html)   8000(SearchButton)
          10002             5001(SearchPage.html)   8001(DropDownMenu)
          10003             5002 (Welcome.html)     8000 (SearchButton)
          10004             5002 (Welcome.html)     8001 (DropDownMenu)
          10005             5002 (Welcome.html)     8004 (lotoutform)  
          10006             5003 (ContactUs.htm)    8003 (loginForm)
          10007             5004 (AboutUs.htm)      8002 (loginForm)

Теперь, что мне нужно, с учетом идентификатора домена, я хочу получить список всех доступных плагинов веб-страниц, чтобы плагин не повторялся более чем на одной веб-странице. Другими словами, комбинация веб-страницы и плагина для каждого плагина, чтобы плагин не повторялся более чем на одной веб-странице.

Так для домена 1000 (google.com)

Я хочу получить результат

          5002 (Welcome.html)     8000 (SearchButton)
          5002 (Welcome.html)     8001 (DropDownMenu)
          5002 (Welcome.html)     8004 (lotoutform)
          5003 (ContactUs.htm)    8003 (loginForm)

Я выбрал только 5002 и 5003 веб-страницы, поскольку они включают в себя все плагины для домена 1000 (google.com). Есть еще одна вещь, предпочтительно выбирать веб-страницу только с одним плагином. Но я заинтересован в поиске решения без этого предпочтения, позже, возможно, я смогу улучшить решение.

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Вы можете посмотреть на это с другой точки зрения, так как вы возвращаете одну строку для каждого типа плагина, вам нужны все типы плагина в домене, а также пример страницы, где этот тип плагина, ну, в общем, вставлен -в чем-то вроде:

Select PluginTypeName, 
  (select top 1 WebpageName 
    from WebPage w
      inner join Plugin p on p.WebpageID = w.WebpageID
    where p.pluginTypeID = pt.pluginTypeID) as SampleWebPage
From PluginTypes pt

это вернет что-то вроде:

searchButton    SearchPage.html
DropDownMenu    SearchPage.html
InteractiveForm null
loginForm       ContactUs.html
lotoutform      Welcome.html             
1 голос
/ 20 января 2011
SELECT  PluginTypeId,
        (
        SELECT  webpageID
        FROM    plugin pi
        WHERE   pi.pluginTypeId = pd.pluginTypeId
                AND webPageID IN
                (
                SELECT  WebPageID
                FROM    WebPage
                WHERE   DomainId = 1000
                )
        ORDER BY
                (
                SELECT  COUNT(*)
                FROM    plugin pc
                WHERE   pc.webpageId = pi.webpageId
                )
        LIMIT 1
        ) AS WebPageId
FROM    Plugin pd
WHERE   WebPageId IS NOT NULL
0 голосов
/ 20 января 2011

Приведенный выше результат (представленный SWeko) должен работать, я его пробовал, может дать повторные результаты.Кроме того, он группирует результаты по доменам ... Вот модификация:

Select DISTINCT DomainID, pt.PluginTypeName, 
  (select top 1 WebpageName 
    from WebPage w
      inner join Plugin p on p.WebpageID = w.WebpageID
    where p.pluginTypeID = pt.pluginTypeID) as SampleWebPage
From PluginTypes pt
GROUP BY DomainID, pt.PluginTypeName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...