PHP/MYSQL: Кестенің соңғы жазбасын біріктірілген кестенің ЖСН және жолдар санында алу

Жақсы, сондықтан менде екі кесте бар, санаттағы кесте мен хабарлар кестесі бар.

Мен әрбір категорияны, осы санатқа арналған кестедегі соңғы жазбаны (category.id = post.category_id) және post.category_id = category.id бар барлық жазбалардың қатпарлық санын қайтаратын сұрау жасауды жоспарладым)

i.e.

Санат үшін ең соңғы жазба жазбасы бар санаттар тізімі және осы категориядағы хабарлардың саны.

Мен әртүрлі қосылыстар мен субселектілерді сынап көрдім және санаттар тізімін, олардың есептік жазбаларын және алғашқы жазбаны (маған соңғы қажет) алуды жөн көрдім.

Мен сондай-ақ категориялар тізімін және олардың соңғы жазбаларын ала алдым, бірақ кейінгі есептерді емес.

Кез келген көмек/нұсқаулар өте бағаланады!

2

2 жауаптар

Мынаны көріңіз:

SELECT category_id, MAX(post_id) AS post_id, COUNT(*) AS posts
FROM post
GROUP BY category_id

Бұл сізде post_id деген баған бар, ол қатаң өсіп, бірегей.

Егер сізде мұндай өріс болмаса, бірақ бірегей емес post_date мысалына ие болсаңыз, екі хабарламада бірдей уақыт белдеуі бар сирек жағдайларда бірнеше санаттар үшін екі жолды алуға болады.

Сондай-ақ, категорияларды қолдарсыз алуға LEFT JOIN:

SELECT
    category.id AS category_id,
    MAX(post.id) AS post_id,
    COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id

Әрбір кестеден көбірек бағандар қажет болса, түпнұсқа кестелермен жоғарыдағы нәтижеге қосыла аласыз:

SELECT *
FROM
(
    SELECT
        category.id AS category_id,
        MAX(post.id) AS post_id,
        COUNT(post.category_id) AS posts
    FROM category
    LEFT JOIN post
    ON category.id = post.category_id
    GROUP BY category.id
) T1
JOIN category
ON T1.category_id = category.id
LEFT JOIN post
ON T1.post_id = post.id
1
қосылды
@ user1018742: Қатені белгілегеніңіз үшін рақмет. Мен оны түзету үшін жауапты жаңарттым.
қосылды автор Mark Byers, көзі
Сіздің жауапыңыз үшін рақмет Марк, ол керемет жұмыс жасайды - тек аздаған мазасыздық. Бұл тек кемінде бір лауазымы бар санаттарды қайтарады, сонымен қатар, ешқандай хабарларсыз санаттарды қайтару үшін өзгертілуі мүмкін бе? Көңілділер!
қосылды автор Sam, көзі
Ғажайып! Менің қажеттіліктерім үшін тез шапшаң және ол өте жақсы жұмыс істейді - өте рахмет!
қосылды автор Sam, көзі
Қызығушылық танытқан басқа адамдар үшін - 'category.id AS category_id' санатына 5-жолдағы 'category.id' дегенді өзгерттім және қазір ол тамаша жұмыс істейді
қосылды автор Sam, көзі

Сіздің деректеріңізде біраз деректер жоқ (мен жорамалдар жасадым), бірақ SQL:

SELECT category_id,max(postdate) last,count(id) postcount
FROM posts
GROUP BY category_id

Егер сізге санат кестесінен бірдеңе керек болса, онда сіз оған қосыла аласыз.

Болжам:

  1. Хабарлар кестесіндегі пошта хабарының жасалынған күнін көрсететін postdate деп аталатын баған бар (және ең көп дегенде ең соңғы). Егер сізде күн болмаса, max (id) -ті де жасай аласыз ... бірақ ешқандай өзгеріс болмаған жағдайда ғана өткен жаңалық жаңартылуы мүмкін, себебі ол соңғы уақытта тиімдірек болады (мысалы, өткен аптада id = 2, бүгін кеше жаңартылған, id = 3 кеше жасалған).
  2. id деп аталатын баған бар - әр жолға арналған бірегей идентификатор.

Егер сіз соңғы жазбаның мазмұнын қажет етсеңіз, бұны пошта кестесіне қосу керек.

1
қосылды
Рудуға рахмет. Мен соңғы өрісті іздестіру үшін өрістер кестесіндегі id өрісін қолданғым келеді. Менің жіберген сұрағым пошта хабарларына қосылатын санаттарды ғана қайтарады (пошта жіктеуіне қарамастан барлық санаттарын қайтарғым келеді). Сонымен қатар, мен пошта деректеріне қосылуға тырыстым және category_id, бірінші жазба жазбасы соңғы емес, қайтарылады.Сондальді ғана қолданамын (немесе ойымша!)
қосылды автор Sam, көзі