2013-04-15 4 views
0

Мои этот запрос получать 6 записей из перепродаж таблицы для shipwynum 151513: -MySQL группировка запросов логика

select re.recdat, 
     re.resaleid, 
     IF (re.benownsal != '', owsal.ownshortnam, if ((re.grptypsal != '' && 
     re.bogrpidsal != ''), if (bosal.bogrpshort != '', bosal.bogrpshort, 
      bosal.bogrpnam), cou1.nation)) as seller, 
     IF (re.benownpur != '', owpur.ownshortnam, if ((re.grptyppur != '' && 
     re.bogrpidpur != ''), if (bopur.bogrpshort != '', bopur.bogrpshort, 
      bopur.bogrpnam), cou.nation)) as buyer, 
     re.benownpur, 
     re.grptyppur, 
     re.bogrpidpur, 
     re.statuscod, 
     re.showinob, 
     re.benownsal, 
     re.grptypsal, 
     re.bogrpidsal 
from resale as re 
     left join owner as owpur on owpur.ownwynum = re.benownpur 
     left join owner as owsal on owsal.ownwynum = re.benownsal 
     left join bogroup as bopur on bopur.bogrpid = re.bogrpidpur 
     left join bogroup as bosal on bosal.bogrpid = re.bogrpidsal 
     left join country as cou on cou.coucod = re.buynation 
     left join country as cou1 on cou1.coucod = re.selnation 
where re.shipwynum = '151513' and 
     re.deleted = 'N' 
order by re.saltyp desc, 
      re.recdat 

Здесь я добавил образец экран данных выстрел получил сверху запроса для shipwynum 15153: -

enter image description here Когда я добавляю предложение предела LIMIT 1, то его получение первой записи, которую я ожидал. Но это единственное для одного корабля, у которого есть shipwynum = 151513. Я хочу получить первую запись за каждый корабль.

Какие изменения я делаю для получения таких записей для каждого корабля.

Любая помощь была бы принята с благодарностью.

Спасибо.

+0

использовать группу и снять предел. используйте 'group by re.shipwynum' в конце запроса, и вы получите одну запись для всего корабля. –

+0

не только для одной записи, я хочу получить первую запись для каждой транзакции перепродажи. Я выше запроса, если я обнаружил, что какая-либо другая запись отбрасывает первый, тогда это было бы неправильно. Порядок отправляется из предложения order by. – Bajrang

+0

Можете ли вы добавить некоторые данные образца? Из внешнего вида запроса вы должны получать одну строку для каждой транзакции перепродажи. –

ответ

0

Вы можете использовать свой запрос в качестве внутреннего запроса и группировать его снаружи. Попробуйте ваш запрос как:

select abc.recdat, abc.resaleid, abc.seller, abc.buyer,abc.benownpur, 
abc.grptyppur, abc.bogrpidpur, abc.statuscod, abc.showinob, abc.benownsal, abc.grptypsal, abc.bogrpidsal 

    from (select re.recdat, 
     re.resaleid, 
     IF (re.benownsal != '', owsal.ownshortnam, if ((re.grptypsal != '' && 
     re.bogrpidsal != ''), if (bosal.bogrpshort != '', bosal.bogrpshort, 
      bosal.bogrpnam), cou1.nation)) as seller, 
     IF (re.benownpur != '', owpur.ownshortnam, if ((re.grptyppur != '' && 
     re.bogrpidpur != ''), if (bopur.bogrpshort != '', bopur.bogrpshort, 
      bopur.bogrpnam), cou.nation)) as buyer, 
     re.benownpur, 
     re.grptyppur, 
     re.bogrpidpur, 
     re.statuscod, 
     re.showinob, 
     re.benownsal, 
     re.grptypsal, 
     re.bogrpidsal, 
     re.shipwynum 
from resale as re 
     left join owner as owpur on owpur.ownwynum = re.benownpur 
     left join owner as owsal on owsal.ownwynum = re.benownsal 
     left join bogroup as bopur on bopur.bogrpid = re.bogrpidpur 
     left join bogroup as bosal on bosal.bogrpid = re.bogrpidsal 
     left join country as cou on cou.coucod = re.buynation 
     left join country as cou1 on cou1.coucod = re.selnation 
where re.shipwynum = '151513' and 
     re.deleted = 'N' 
order by re.saltyp desc, 
      re.recdat)abc group by abc.shipwynum 
0

Вы можете использовать этот запрос - цель состоит в том, чтобы получить [п] resaleids для каждого shipwynum, где [п = 2] является

SELECT (SUBSTRING_INDEX(GROUP_CONCAT(CONVERT(resaleid, CHAR(8)) ORDER BY resaleid DESC), ',', 2)) AS ID FROM resale WHERE deleted = 'N' GROUP BY shipwynum 

Пожалуйста, не то, что результат GROUP_CONCAT усекается до максимального len 1024 (group_concat_max_len). И это может иметь проблемы с производительностью, поэтому, пожалуйста, не стесняйтесь обновлять и оптимизировать по мере необходимости.

Другим предложением было бы установить ранг, но не как это будет работать для вас. Вы можете проверить ранг: http://www.oracle-base.com/articles/misc/rank-dense-rank-first-last-analytic-functions.php#rank

Надеюсь, это поможет.

SELECT re.recdat, 
     re.resaleid, 
     IF (re.benownsal != '', owsal.ownshortnam, if ((re.grptypsal != '' && re.bogrpidsal != ''), if (bosal.bogrpshort != '', bosal.bogrpshort, bosal.bogrpnam), cou1.nation)) as seller, 
     IF (re.benownpur != '', owpur.ownshortnam, if ((re.grptyppur != '' && re.bogrpidpur != ''), if (bopur.bogrpshort != '', bopur.bogrpshort, bopur.bogrpnam), cou.nation)) as buyer, 
     re.benownpur, 
     re.grptyppur, 
     re.bogrpidpur, 
     re.statuscod, 
     re.showinob, 
     re.benownsal, 
     re.grptypsal, 
     re.bogrpidsal 

FROM resale AS re 
     left join owner as owpur on owpur.ownwynum = re.benownpur 
     left join owner as owsal on owsal.ownwynum = re.benownsal 
     left join bogroup as bopur on bopur.bogrpid = re.bogrpidpur 
     left join bogroup as bosal on bosal.bogrpid = re.bogrpidsal 
     left join country as cou on cou.coucod = re.buynation 
     left join country as cou1 on cou1.coucod = re.selnation 

WHERE LOCATE (re.resaleid, 
(
    SELECT GROUP_CONCAT(it.resaleid) AS ids 
     FROM (
       SELECT (SUBSTRING_INDEX(GROUP_CONCAT(CONVERT(resaleid, CHAR(8)) ORDER BY resaleid DESC), ',', 2)) AS ID FROM resale WHERE deleted = 'N' GROUP BY shipwynum 
      ) it 
)) <> 0 
    /* AND re.deleted = 'N' */ 
order by re.saltyp desc, 
      re.recdat 
Смежные вопросы