2011-01-20 5 views
1

Я застрял в этой проблеме некоторое время. Сначала я объясню структуру таблицыSQL Query (pl/sql) для сложной логики

Есть четыре таблицы в моей системе

домена

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 

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

 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). Есть еще одна вещь, предпочтительнее выбрать веб-страницу с одним плагином. Но я заинтересован в поиске решения без этого предпочтения, позже, возможно, я смогу улучшить решение.

+0

Вы ищете команду «DISTINCT»? – Eugene

+0

Для какой базы данных конкретно?Синтаксис не на 100% тот же –

ответ

2

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

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

Спасибо Sweko, это хороший подход для решения этой проблемы! – Maximus

1
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

выше результата (представленный 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 
Смежные вопросы