Як замовіць групу, і атрымаць першую радок?

У мяне гэтая заява MySQL PHP

SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
join members m on a.members_id = m.id
join pictures p on m.pictures_id = p.id
WHERE a.active = 1
GROUP BY a.members_id
order by a.`date added` DESC
limit 1;

Аднак гэта не працуе. У табліцы на карце маюцца запісы, і многія з іх могуць мець адзін і той жа members_id значэнне. Я хачу, каб згрупаваць іх па members_id , а затым замовіць іх даце дадання , таму самы апошні знаходзіцца на вяршыні кожнай групы, а затым атрымаць толькі верхні шэраг (г.зн. з'явіцеся апошні з кожнай групы).

Хто-небудзь тут ведае, што не так?

дзякуй

0
сво MySQL ад www.000webhost.com
дададзена аўтар omega, крыніца
сво MySQL ад www.000webhost.com
дададзена аўтар omega, крыніца
Ці можаце вы пацьвердзіць, ці сапраўды вы карыстаецеся MySQL або MariaDB (яго адкрытым зыходным кодам відэльцы)?
дададзена аўтар Mark Bannister, крыніца
Ці можаце вы пацьвердзіць, ці сапраўды вы карыстаецеся MySQL або MariaDB (яго адкрытым зыходным кодам відэльцы)?
дададзена аўтар Mark Bannister, крыніца
можа ў пляснуць схемы і некаторыя дадзеныя ў sqlfiddle. і будзе атрымаць адказ хутчэй. Акрамя таго, я імкнуся ніколі не выкарыстоўваць дзе становішча ў аб'яднанні, калі я не маю справы з дапушчальнай пустым. ўключаюць у сябе, што крытэрыі ў «на» становішчы
дададзена аўтар Drew, крыніца
можа ў пляснуць схемы і некаторыя дадзеныя ў sqlfiddle. і будзе атрымаць адказ хутчэй. Акрамя таго, я імкнуся ніколі не выкарыстоўваць дзе становішча ў аб'яднанні, калі я не маю справы з дапушчальнай пустым. ўключаюць у сябе, што крытэрыі ў «на» становішчы
дададзена аўтар Drew, крыніца

8 адказы

Вы не можаце зрабіць гэта ў адным запыце. Замяніць ад карты часткі з подвыборкой

select max(map_id) as map_id, members_id, max(date_added) as date_added from map where active = 1 group by members_id

Гэта дасць вам усе члены з апошнімі датамі. Я выказаў меркаванне, што ваш map_id існуючыя, і быць auto_increment. Выкарыстоўвайце замест зыходнай табліцы карты, і вы не будзеце мець патрэбу ў групе з дапамогай, парадку і лімітавых частак на ўсіх.

1
дададзена

Вы не можаце зрабіць гэта ў адным запыце. Замяніць ад карты часткі з подвыборкой

select max(map_id) as map_id, members_id, max(date_added) as date_added from map where active = 1 group by members_id

Гэта дасць вам усе члены з апошнімі датамі. Я выказаў меркаванне, што ваш map_id існуючыя, і быць auto_increment. Выкарыстоўвайце замест зыходнай табліцы карты, і вы не будзеце мець патрэбу ў групе з дапамогай, парадку і лімітавых частак на ўсіх.

1
дададзена

Адзін з падыходаў заключаецца ў выкарыстанні , дзе становішча, каб адфільтраваць запісы, якія не зацікаўленыя ў:

SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
join members m on a.members_id = m.id
join pictures p on m.pictures_id = p.id
WHERE a.active = 1 and
      a.`date added` = (select max(map.`date added`)
                        from map
                        where map.members_id = a.members_id and
                              map.active = 1
                       )
GROUP BY a.members_id
order by a.`date added` DESC;
0
дададзена
<�Код> выбраць максімум (map.`date added`) , а не выбраць максімум (a.`date added`)
дададзена аўтар ypercubeᵀᴹ, крыніца

Адзін з падыходаў заключаецца ў выкарыстанні , дзе становішча, каб адфільтраваць запісы, якія не зацікаўленыя ў:

SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
join members m on a.members_id = m.id
join pictures p on m.pictures_id = p.id
WHERE a.active = 1 and
      a.`date added` = (select max(map.`date added`)
                        from map
                        where map.members_id = a.members_id and
                              map.active = 1
                       )
GROUP BY a.members_id
order by a.`date added` DESC;
0
дададзена
<�Код> выбраць максімум (map.`date added`) , а не выбраць максімум (a.`date added`)
дададзена аўтар ypercubeᵀᴹ, крыніца

спроба:

select * from
(SELECT a.*, 
        p.filename, 
        m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
 FROM map a
 join members m on a.members_id = m.id
 join pictures p on m.pictures_id = p.id
 WHERE a.active = 1
 order by a.members_id, a.`date added` DESC) sq
GROUP BY members_id;

Варта адзначыць, што той факт, што MySQL вяртае першы радок, калі групоўка ня дакументавана і можа змяніцца ў будучых версіях - так што, хоць гэты запыт павінен працаваць з бягучымі версіямі MySQL, гэта не гарантавана, каб зрабіць гэта ў будучыні.

0
дададзена
@ypercube: Я не ведаю, што - вы ведаеце, калі такія паводзіны разыходзіліся (гэта значыць, у якой версіі MariaDB.)?
дададзена аўтар Mark Bannister, крыніца
@ypercube - дзякуй за гэтую інфармацыю. (Я пайшоў з парадкам па/групавы трук, таму што гэта было тое, што ОП ўжо спрабаваў зрабіць - я зразумеў, што праблемы з прадукцыйнасцю гналі яго Відавочна, карэляваць подзапросов, як правіла, пераважней, у MySQL.).
дададзена аўтар Mark Bannister, крыніца
Я думаю, што з аптымізатарам ў 5.3 і 5.5. Аптымізатар разумее, што ўнутраны ORDER BY залішні і выдаляе яго з плану. См: GROUP BY трук быў аптымізаваны прэч </а>
дададзена аўтар ypercubeᵀᴹ, крыніца
Яна не працуе (прама цяпер) з бягучай версіяй MariaDB.
дададзена аўтар ypercubeᵀᴹ, крыніца

спроба:

select * from
(SELECT a.*, 
        p.filename, 
        m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
 FROM map a
 join members m on a.members_id = m.id
 join pictures p on m.pictures_id = p.id
 WHERE a.active = 1
 order by a.members_id, a.`date added` DESC) sq
GROUP BY members_id;

Варта адзначыць, што той факт, што MySQL вяртае першы радок, калі групоўка ня дакументавана і можа змяніцца ў будучых версіях - так што, хоць гэты запыт павінен працаваць з бягучымі версіямі MySQL, гэта не гарантавана, каб зрабіць гэта ў будучыні.

0
дададзена
@ypercube: Я не ведаю, што - вы ведаеце, калі такія паводзіны разыходзіліся (гэта значыць, у якой версіі MariaDB.)?
дададзена аўтар Mark Bannister, крыніца
@ypercube - дзякуй за гэтую інфармацыю. (Я пайшоў з парадкам па/групавы трук, таму што гэта было тое, што ОП ўжо спрабаваў зрабіць - я зразумеў, што праблемы з прадукцыйнасцю гналі яго Відавочна, карэляваць подзапросов, як правіла, пераважней, у MySQL.).
дададзена аўтар Mark Bannister, крыніца
Я думаю, што з аптымізатарам ў 5.3 і 5.5. Аптымізатар разумее, што ўнутраны ORDER BY залішні і выдаляе яго з плану. См: GROUP BY трук быў аптымізаваны прэч </а>
дададзена аўтар ypercubeᵀᴹ, крыніца
Яна не працуе (прама цяпер) з бягучай версіяй MariaDB.
дададзена аўтар ypercubeᵀᴹ, крыніца

Калі вы хочаце, каб атрымаць адзін вынік на карце, вы павінны выбраць яго ў два этапы - так з подзапросов. Ўнутраны запыт атрымлівае новую карту на кожны член і знешні запыт атрымлівае ўсе дадзеныя. Будзьце асцярожныя з індэксамі, у адваротным выпадку ён будзе вельмі павольным.

Я думаю, што гэта будзе нешта накшталт:

    SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
inner join members m on a.members_id = m.id
inner join pictures p on m.pictures_id = p.id
inner join (
    select max(a.`date added`) as maxdate from map ia where ia.members_id = m.id)
) as sub_a on sub_a.member_id = a.member_id and sub_a.maxdate = a.`date added` 
WHERE a.active = 1

Гэта залежыць ад аднаго максімальнага дата дададзеная , у адваротным выпадку вам спатрэбіцца яшчэ некалькі трукаў.

0
дададзена
Вам трэба GROUP BY ia.members_id у подзапросов, а не , дзе ia.members_id = m.id
дададзена аўтар ypercubeᵀᴹ, крыніца

Калі вы хочаце, каб атрымаць адзін вынік на карце, вы павінны выбраць яго ў два этапы - так з подзапросов. Ўнутраны запыт атрымлівае новую карту на кожны член і знешні запыт атрымлівае ўсе дадзеныя. Будзьце асцярожныя з індэксамі, у адваротным выпадку ён будзе вельмі павольным.

Я думаю, што гэта будзе нешта накшталт:

    SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
inner join members m on a.members_id = m.id
inner join pictures p on m.pictures_id = p.id
inner join (
    select max(a.`date added`) as maxdate from map ia where ia.members_id = m.id)
) as sub_a on sub_a.member_id = a.member_id and sub_a.maxdate = a.`date added` 
WHERE a.active = 1

Гэта залежыць ад аднаго максімальнага дата дададзеная , у адваротным выпадку вам спатрэбіцца яшчэ некалькі трукаў.

0
дададзена
Вам трэба GROUP BY ia.members_id у подзапросов, а не , дзе ia.members_id = m.id
дададзена аўтар ypercubeᵀᴹ, крыніца