මට MySQL පේළි කිහිපයක් එක් ක්ෂේත්‍රයකට සම්බන්ධ කළ හැකිද?


1225

භාවිතා කරමින් MySQL, මට මෙවැනි දෙයක් කළ හැකිය:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

මගේ ප්‍රතිදානය:

shopping
fishing
coding

නමුත් ඒ වෙනුවට මට අවශ්‍ය වන්නේ පේළි 1 යි, 1 කොල්:

අපේක්ෂිත ප්‍රතිදානය:

shopping, fishing, coding

හේතුව, මම බහු වගු වලින් බහු අගයන් තෝරාගෙන ඇති අතර, සියල්ල සම්බන්ධ වූ පසු මට කැමති ප්‍රමාණයට වඩා පේළි ගොඩක් තිබේ.

මම MySQL Doc හි ශ්‍රිතයක් සෙවූ අතර එය CONCATහෝ CONCAT_WSශ්‍රිත ප්‍රති result ල කට්ටල පිළිගන්නා බවක් නොපෙනේ .

ඉතින් මෙහි සිටින කිසිවෙකු මෙය කරන්නේ කෙසේදැයි දන්නවාද?


9
ඔබට ප්‍රයෝජනවත් විය හැකි group_concat භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳව මම කුඩා නිරූපණයක් ලියා ඇත: giombetti.com/2013/06/06/mysql-group_concat
මාක් ජියොම්බෙට්ටි

Answers:


1759

ඔබට භාවිතා කළ හැකිය GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

ලුඩ්විග් සිය අදහස් දැක්වීමේදී සඳහන් කළ පරිදි ,DISTINCT අනුපිටපත් වළක්වා ගැනීමට ඔබට ක්‍රියාකරු එක් කළ හැකිය :

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

ජෑන් ඔවුන්ගේ අදහස් දැක්වීමේදී සඳහන් කර ඇති පරිදි , ඔබට එය භාවිතා කිරීමට පෙර අගයන් වර්ග කළ හැකිය ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

ඩැග් සිය අදහස් දැක්වීමේදී සඳහන් කළ පරිදි ප්‍රති .ලය සඳහා බයිට් 1024 සීමාවක් තිබේ. මෙය විසඳීම සඳහා, ඔබේ විමසීමට පෙර මෙම විමසුම ක්‍රියාත්මක කරන්න:

SET group_concat_max_len = 2048;

ඇත්ත වශයෙන්ම, 2048ඔබේ අවශ්යතා අනුව ඔබට වෙනස් විය හැකිය . අගය ගණනය කිරීමට සහ පැවරීමට:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);

157
එහි ප්‍රති ing ලයක් ලෙස ඇති තීරුවේ බයිට් 1024 ක සීමාව ගැන දැනුවත් වන්න (පරාමිති group_concat_max_len බලන්න )
ඩැග්

81
DISTINCTපරාමිතිය එකතු කිරීමෙන් ඔබට කිසිදු යුගලයක් නොලැබෙනු ඇත. ... GROUP_CONCAT(DISTINCT hobbies)
ලුඩ්විග්

3
මගේ අවශ්‍යතාවය වූයේ සියලු දත්ත එක් තීරුවකින් ලබා ගැනීමයි. මෙය කිරීමට GROUP BY වගන්තිය භාවිතා නොකරන්න. උදාහරණය: පරිශීලකයින්ගෙන් GROUP_CONCAT තෝරන්න (SEPARATOR ',' ඊමේල්);
ජොනතන් බර්ජරන්

1
ස්තූතියි, කණ්ඩායම් කොන්ක්‍රීට් දිග සීමාවක් ඇති බව මම දැන සිටියේ නැත. මා විසින් ජනනය කරන ලද රාක්ෂ ලැයිස්තුවක් සොයා ගැනීමට මට එය අවශ්‍ය විය.
පැට්‍රික්

9
එහි SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
ජනවාරි

108

බලන්න කියලා GROUP_CONCATඔබේ MySQL අනුවාදය (4.1) එය සහාය දක්වන්නේ නම්. බලන්න ලේඛගතකිරීම වැඩි විස්තර සඳහා.

එය මේ වගේ දෙයක් වනු ඇත:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

11
මම හිතන්නේ group by 'all'එය අවශ්‍ය නොවේ (එපමණක් නොව අනවශ්‍ය), මන්ද මෙය සියලු පේළි නූල් වලට පවරා allපසුව මෙම පේළි අතර නූල් සංසන්දනය කරන්න. මම හරිද?
Krzysiek

75

බහු, තනි පේළි සංයුක්ත කිරීම සඳහා විකල්ප වාක්‍ය ඛණ්ඩය

අවවාදයයි: මෙම ලිපිය ඔබට බඩගිනි වනු ඇත.

ලබා දී ඇත්තේ:

සමූහයක් වෙනුවට තනි, තනි පේළි කිහිපයක් තෝරා ගැනීමටත් , එක්තරා ක්ෂේත්‍රයක් සමඟ සමපාත වීමටත් මට අවශ්‍ය බව මට පෙනී ගියේය.

ඔබට නිෂ්පාදන අයිඩී වගුවක් සහ ඒවායේ නම් සහ මිල ගණන් ඇති බව කියමු:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

එවිට ඔබට මෙම බලු පැටවුන් පිරික්සුම් කොටු ලෙස ලැයිස්තු ගත කරන විසිතුරු-විකාර අජැක්ස් තිබේ.

ඔබේ බඩගිනි-හිපෝ පරිශීලකයා තෝරා ගනී 13, 15, 16. අද ඇයට අතුරුපසක් නැහැ ...

සොයන්න:

පිරිසිදු mysql සමඟ ඔබේ පරිශීලකයාගේ ඇණවුම එක පේළියකින් සාරාංශ කිරීමේ ක්‍රමයක්.

විසඳුමක්:

භාවිතය GROUP_CONCATසමග එම INවගන්තිය :

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

කුමන ප්‍රතිදානයන්:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

පාරිතෝෂික විසඳුම:

ඔබට මුළු මිලම අවශ්‍ය නම්, මෙයට විසි කරන්න SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PS: ඔබ ළඟ ඉන්-එන්-අවුට් නොමැති නම් සමාව ඉල්ලන්න ...


11
මෙය හොඳ පිළිතුරක් වුවද, මෙය හුදෙක් පිළිතුරු දීමට වඩා වෙළඳ දැන්වීම් ලෙස පෙනේ. තවමත් හොඳ හැඩයෙන් යුත් පිළිතුරකි.
FliiFe

1
මට උදව් ලබා ගත හැක stackoverflow.com/q/60278898/11697039 @elbowlobstercowstand
zus

40

පරාමිතිය GROUP_CONCATසැකසීමෙන් ඔබට අගයෙහි උපරිම දිග වෙනස් කළ හැකිය group_concat_max_len.

MySQL ලේඛනයේ විස්තර බලන්න .



27

මගේ නඩුවේදී මට අයිඩීස් පේළියක් තිබූ අතර එය වර්‍ගයට දැමීම අත්‍යවශ්‍ය විය, එසේ නොමැති නම්, ප්‍රති result ලය ද්විමය ආකෘතියට කේතනය කර ඇත:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

1
ස්තූතියි! තොරව CASTමම කැමති අගයන් විය [BLOB - 14 Bytes]දී ප්රතිඵලය ගැන!
මෙල්_ටී

1
මට උදව් ලබා ගත හැක stackoverflow.com/q/60278898/11697039 @Fedir RYKHTIK
zus

17

පහත දැක්වෙන ආකාරයට MySQL (5.6.13) සැසි විචල්‍යය සහ පැවරුම් ක්‍රියාකරු භාවිතා කරන්න

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

එවිට ඔබට ලබා ගත හැකිය

test1,test11

2
එය GROUP_CONCAT ට වඩා වේගවත්ද?
jave.web

1
මම මෙය PHPMyAdmin යටතේ MySQL සේවාදායකය v5.6.17 සමඟ පරීක්ෂණ වගුවක විස්තර තීරුවක (varchar (50)) පරීක්‍ෂා කළ නමුත් එය සෑම වාර්තාවක් සඳහාම BLOB ක්ෂේත්‍රයක් ලබා දෙයි:SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Jan

15

මට වඩාත් සංකීර්ණ විමසුමක් ඇති අතර, මට එය භාවිතා කළ යුතු බව පෙනී ගියේය GROUP_CONCAT එය ක්‍රියාත්මක කිරීම සඳහා පිටත විමසුමක කළ යුතු :

මුල් විමසුම:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

පුපුරා ගිය:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

මෙය යමෙකුට උපකාර කරනු ඇතැයි සිතමි.


9

මෙහි GROUP_CONCATඋපසිරැසි සමඟ භාවිතා කරන්නේ කෙසේදැයි බලන අයෙකුට - මෙම උදාහරණය පළ කිරීම

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

එබැවින් GROUP_CONCATඋපවගන්තිය තුළ භාවිතා කළ යුතුය, එය එතීම නොවේ.


1
මෙය මා සොයන
දේමයි

8

මේක උත්සාහ කරන්න:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

2
මට ලැබුණේ මෙයයි: 'හඳුනා නොගත් ප්‍රකාශන වර්ගය. (0 වන ස්ථානයේ "DECLARE" අසල) '
ඉස්තියැක් අහමඩ්

1

MySQL හි තීරු සංයුක්ත කිරීමට අපට ක්‍රම දෙකක් තිබේ

select concat(hobbies) as `Hobbies` from people_hobbies where 1

හෝ

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.