2011-08-12 51 views
12

Trong bảng mysql info tôi có:Chọn một hàng mà không cần mục trùng lặp

Id, Name, thành phố, ngày, tình trạng

Tôi muốn chọn tất cả các tên từ "info" Lập truy vấn

$query = mysql_query("SELECT name FROM info WHERE status = 1 ORDER BY id") 
     or die(mysql_error()); 

while ($raw = mysql_fetch_array($query)) 
{ 
    $name = $raw["name"]; 
    echo ''.$name.'<br>'; 
} 

Vâng, kết quả là nó trả về tất cả các mục nhập. Tôi muốn lặp lại tất cả các mục nhập không trùng lặp.

Nói: dưới tên "thô", chúng tôi đã chèn tên "John" 10 lần.
Tôi muốn chỉ lặp lại một lần. Điều này có khả thi không?

Trả lời

30

Nó khá đơn giản:

SELECT distinct name FROM info WHERE status = 1 ORDER BY id 

Từ khóa SQL DISTINCT hiện các trick.

+0

Câu trả lời hay, cảm ơn bạn @ Bohemian ♦ –

2

thêm GROUP BY name to SQL Statment của bạn - điều này sẽ chỉ mang lại một trong mỗi mục từ tên cột

+0

Khi tên GROUP được áp dụng, nó chỉ lấy hàng đầu tiên? nếu theo thứ tự bằng ID? – YumYumYum

+1

@YumYumYum thứ tự không được đảm bảo trừ khi bạn thêm câu lệnh 'order by' – ManseUK

+0

Cảm ơn vì sự an toàn tôi đã sử dụng id SELECT này, duplicate_name, duplicate_email từ SERVICE nơi duplicate_email='[email protected] 'GROUP BY duplicate_email ORDER BY id ', cung cấp cho tôi hàng khi người dùng đó đã đăng ký và đăng nhập lần sau vào dự án cụ thể – YumYumYum

5

Thay đổi

SELECT name FROM info WHERE status = 1 ORDER BY id 

để

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id 

Quan sát rằng GROUP BY đã được bổ sung. Thông tin thêm về nhóm bởi http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

Edit:
cho tên với số apparences thử

SELECT name, count(name) FROM info WHERE status = 1 GROUP BY name ORDER BY id
+0

hoạt động, nhưng tôi muốn chơi chữ sau tên" số "có bao nhiêu mục nhập giống như 'mã' echo' này '. $ name.' (lần) '; – Darius

0

sử dụng GROUP BY tên tuyên bố

$query = mysql_query("SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id") or  die(mysql_error()); 

while ($raw = mysql_fetch_array($query)) { 
       $name = $raw["name"]; 
       echo ''.$name.'<br>'; 
       } 
12

hãy thử sử dụng điều này như truy vấn của bạn:

SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id 

để có được tên riêng biệt

hoặc là sử dụng gợi ý khác GROUP BY

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id 

Tôi nghĩ rằng một trong những đầu tiên là trực quan hơn và không có sự khác biệt hiệu suất lớn giữa hai

EDIT

vì OP cũng muốn biết số lượng tên tại đây, chúng tôi đi:

SELECT name,COUNT(id) AS n_names 
FROM info WHERE status = 1 
GROUP BY name 
ORDER BY name 

bạn có thể ORDER BYname hoặc n_names tùy thuộc vào những gì bạn cần

+0

+1 bạn đã nhanh hơn tôi vài giây :) – Bohemian

0

Điều này phù hợp với tôi, trả về tên bảng cho một cơ sở dữ liệu cụ thể.

my $sql="select distinct table_name from COLUMNS where table_schema='$database'" 
my $sth = $dbht->prepare($sql) 
     or die "Cannot prepare SQL statement: $DBI::errstr\n"; 
    $sth->execute 
     or die "Cannot execute SQL statement: $DBI::errstr\n"; 

    if ($DBI::err){ 

    $msg= "Data fetching terminated early by error: $DBI::errstr"; 

} 


while (@col=$sth->fetchrow_array()){ 
    $table[$i]=$col[0]; 
    $i++; 
}  
0

Giả sử bạn đang gửi sms hàng loạt và bạn không muốn gửi cùng một tin nhắn hai lần cho cùng một chàng trai John. Những gì tôi phát hiện ra, đó là sử dụng mẹo của GROUP BY và ORDER BY cùng một lúc hoạt động hoàn hảo. Nhưng tôi không nói đó là cách tốt nhất. Sau đây là cách u có thể sử dụng nó

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY name 

EDIT: này rất quan trọng cần lưu ý, khi bạn cần thêm sau đó cột duy nhất và có giá trị là duy nhất cho mỗi hàng thì DISTINCT không giúp.

+1

+1 điều này là đúng trong trường hợp của tôi. Bởi vì tôi đã phải lấy 'SELECT id, tên, email từ SIGNUP nơi nhóm = 'admin' Nhóm bằng email ORDER bởi id' – YumYumYum

+0

Có tôi quá Tôi đã thử nghiệm nó và làm việc – humphrey

0

$ sql = "SELECT DISTINCT name FROM status = 1 GROUP BY name ORDER BY name";

$query = mysqli_query($conn,$sql); 
<?php while ($fire=mysqli_fetch_array($query)) { ?> 
<h4><?php echo $query['name']; ?><br></h4> 
<?php } ?> 
Các vấn đề liên quan