เลือกค่าที่ไม่ซ้ำจากคอลัมน์


195

ฉันมีตาราง MySQL ซึ่งมีข้อมูลประเภทต่อไปนี้:

    Date            product 
2011-12-12           azd
2011-12-12           yxm
2011-12-10           sdx
2011-12-10           ssdd  

นี่คือตัวอย่างของสคริปต์ที่ฉันใช้เพื่อรับข้อมูลจากตารางนี้:

<?php

$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("db", $con);
$sql=mysql_query("SELECT * FROM buy ORDER BY Date");
while($row = mysql_fetch_array($sql))
{

 echo "<li><a href='http://www.website/". $row['Date'].".html'>buy ". date("j, M Y", strtotime($row["Date"]))."</a></li>";

    }
    mysql_close($con);
?> 

สคริปต์นี้แสดงทุกวันจากตารางเช่น

12.dec 2011
12.dec.2011
10.dec.2011
10.dec.2011

ฉันต้องการจะแสดงเฉพาะวันที่ที่ไม่ซ้ำเช่น

12.dec.2011
10.dec.2011

คำตอบ:


361

ใช้ตัวดำเนินการDISTINCTใน MySQL:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

18
ปัญหาที่โชคร้ายDISTINCTคือมันส่งคืนเพียงหนึ่งฟิลด์เท่านั้น ... ดังนั้นหากคุณต้องการให้บันทึกทั้งหมด DISTINCT นั้นไม่มีค่าเลย อย่างไรก็ตามข่าวดีถ้าคุณมีผลลัพธ์ที่ซ้ำกันหลายรายการจากการเข้าร่วมคุณสามารถทำ GROUP BY และรับผลการกรองแบบเต็ม
Chadwick Meyer

1
นั่นไม่ถูกต้อง Chadwick Meyer! คุณสามารถเลือกได้หลายช่อง แต่คุณต้องจัดกลุ่มไว้ คุณสามารถทำให้มันเป็นเช่นนี้: SELECT DISTINCT (name) AS yourName, id เป็น yourId จากตาราง GROUP ตามชื่อ ORDER BY name คุณจะประหลาดใจ!
Lucian Minea

43

ใช้

SELECT DISTINCT Date FROM buy ORDER BY Date

ดังนั้น MySQL จะลบรายการที่ซ้ำกัน

BTW: การใช้ชื่อคอลัมน์อย่างชัดเจนในการSELECTใช้ทรัพยากรน้อยลงใน PHP เมื่อคุณได้รับผลใหญ่จาก MySQL


1
คุณอธิบายได้ไหมว่า "ใช้ชื่อคอลัมน์อย่างชัดเจน" ใช้ทรัพยากรน้อยลงและใช้วิธีใดสูง ด้วยตัวอย่างหน่อยได้ไหม
Nabeel Khan

กรณีใช้งานทั่วไปคือ "สตรีม" ข้อมูลจากฐานข้อมูลไปยังอาร์เรย์หลายมิติใน PHP; ดังนั้นกระบวนการ PHP ของคุณเพียงแค่สูญเสียความทรงจำกับข้อมูลที่คุณอาจไม่ต้องการ สำหรับชุดข้อมูลบางชุดเพียงเล็กน้อยเท่านั้น แต่เมื่อจัดการกับหลายพันแถวอาจทำให้เกิดความแตกต่าง
rabudde

2
@NabeelKhan แทนที่จะใช้ SELECT * ... ใช้คอลัมน์ SELECT 1, คอลัมน์ 2 ... ยกเว้นว่าคุณต้องการคอลัมน์ทั้งหมด
LPChip

@ LPChip โดยใช้ tablename.columnname มีประโยชน์มากกว่าเฉพาะชื่อคอลัมน์หรือไม่
Nabeel Khan

1
@NabeelKhan คุณต้องมี tablename.columnname เมื่อคุณเข้าร่วมตาราง
LPChip

26

ใช้แบบสอบถามนี้เพื่อรับค่า

SELECT * FROM `buy` group by date order by date DESC

3
ฉันพบว่าสิ่งนี้ไม่เป็นประโยชน์ สมมติว่าคุณมี 5 รายการทั้งหมดที่มีเหมือนกันแต่ที่แตกต่างกันdate descriptionการใช้คำสั่งดังกล่าวจะแสดงdates ที่แตกต่างกันแต่เฉพาะdescriptionรายการแรกที่พบ
onebree

@onebree - GROUP BY date,descriptionในกรณีที่คุณสามารถทำได้
ToolmakerSteve

19

ส่วนที่เหลือเกือบจะถูกต้องเว้นแต่พวกเขาควรสั่งตามวันที่ DESC

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

6

DISTINCTเป็นตัวเลือกที่ถูกต้องเสมอเพื่อรับค่าที่ไม่ซ้ำ นอกจากนี้คุณสามารถทำได้โดยไม่ต้องใช้ GROUP BYที่ ซึ่งมีเพียงเพิ่มในตอนท้ายของแบบสอบถามและตามด้วยชื่อคอลัมน์

SELECT * FROM buy GROUP BY date,description

4

DISTINCTคำตอบอื่นแต่มีหลายค่า:

SELECT DISTINCT `field1`, `field2`, `field3` FROM `some_table`  WHERE `some_field` > 5000 ORDER BY `some_field`

2

ใช้สิ่งนี้ในกรณีที่คุณต้องการส่งออกรายละเอียดผลิตภัณฑ์ต่อวันเป็น JSON

SELECT `date`,
CONCAT('{',GROUP_CONCAT('{\"id\": \"',`product_id`,'\",\"name\": \"',`product_name`,'\"}'),'}') as `productsJSON`
FROM `buy` group by `date` 
order by `date` DESC

 product_id product_name     date  
|    1     |     azd    | 2011-12-12 |
|    2     |     xyz    | 2011-12-12 |
|    3     |     ase    | 2011-12-11 |
|    4     |     azwed  | 2011-12-11 |
|    5     |     wed    | 2011-12-10 |
|    6     |     cvg    | 2011-12-10 |
|    7     |     cvig   | 2011-12-09 |

RESULT
       date                                productsJSON
2011-12-12T00:00:00Z    {{"id": "1","name": "azd"},{"id": "2","name": "xyz"}}
2011-12-11T00:00:00Z    {{"id": "3","name": "ase"},{"id": "4","name": "azwed"}}
2011-12-10T00:00:00Z    {{"id": "5","name": "wed"},{"id": "6","name": "cvg"}}
2011-12-09T00:00:00Z    {{"id": "7","name": "cvig"}}

ลองใช้ในSQL Fiddle


0

มีคำหลักที่เฉพาะเจาะจงสำหรับการบรรลุเป้าหมายเดียวกัน

SELECT DISTINCT( Date ) AS Date 
FROM   buy 
ORDER  BY Date DESC; 

0

ขึ้นอยู่กับสิ่งที่คุณต้องการ

ในกรณีนี้ฉันแนะนำ:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

เพราะมีไม่กี่สาขาและเวลาการดำเนินการของต่ำกว่าการดำเนินการของDISTINCTGROUP BY

ในกรณีอื่น ๆ เช่นที่มีหลายฟิลด์ฉันชอบ:

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.