Làm thế nào để lấy ra một số bản ghi ngẫu nhiên từ database?
Nếu tư duy một cách đơn giản thì đầu tiên bạn sẽ phải generate các mã ID ngẫu nhiên rồi từ các mã ID đó query lấy ra bản ghi tương ứng.
Tuy nhiên mã ID generate ra phải làm sao đảm bảo là có tương ứng một bản ghi với nó :-? Điều này có vẻ khó. Thôi vứt đê, đừng bận tâm, bởi MySQL đã hỗ trợ sẵn việc lấy ra các bản ghi ngẫu nhiên rồi :-j
Ví dụ nè:
- Lấy ra ngẫu nhiên 10 người may mắn để trao giải thưởng may mắn sau khi tàn cuộc vui
SELECT * FROM people ORDER BY RAND() limit 10;
- Lấy ra 5 người phụ nữ ngẫu nhiên may mắn để tôn vinh
SELECT * FROM people WHERE sex=’female’ ORDER BY RAND() LIMIT 5;
Text file (/var/text-data/film.txt)
1,Dead Note – part 1,mms://113.113.113.113/huypv/share/film/akzvx.avi
12,Dead Note – part 2,mms://113.113.113.113/huypv/share/film/akzvy.avi
Table film in database share
CREATE TABLE film (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(113), url VARCHAR(113));
mysqlimport –fields-terminated-by=, –lines-terminated-by=”\n” -uroot -pXXX share /var/text-data/film.txt
Notice: Nếu client và server không thuộc cùng một máy thì lệnh như trên sẽ không chạy nữa do mặc định nó sẽ tìm file trên máy server. Lúc này cần thêm tham số để nó tìm file nguồn import ở máy client (local)
mysqlimport –local –fields-terminated-by=, –lines-terminated-by=”\n” -uroot -pXXX share /var/text-data/film.txt
Bonus: Exec SQL query by command
mysql -uroot -pXXX share -e “TRUNCATE TABLE film”
December 21st, 2009
admin
mysql> show grants for ‘vietnam’@'192.168.1.114′;
+——————————————————————-+
| Grants for vietnam@192.168.1.114 |
+——————————————————————-+
| GRANT USAGE ON *.* TO ‘vietnam’@'192.168.1.114′ |
| GRANT ALL PRIVILEGES ON `vietnam_xxx`.* TO ‘vietnam’@'192.168.1.114′ |
+——————————————————————-+
2 rows in set (0.00 sec)
mysql> grant all privileges on vietnam.* to ‘vietnam’@'192.168.1.114′ identified by ‘vietnam_secret_key’;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on vietnam_xxx.* to ‘vietnam’@'192.168.1.114′ identified by ‘vietnam_secret_key’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
mysql> show grants for ‘vietnam’@'192.168.1.114′;
+——————————————————————————————————————+
| Grants for vietnam@192.168.1.114 |
+——————————————————————————————————————+
| GRANT USAGE ON *.* TO ‘vietnam’@'192.168.1.114′ IDENTIFIED BY PASSWORD ‘*FDA32083C6301D4B9D2D49CFED881767E0XXXXXX’ |
| GRANT ALL PRIVILEGES ON `vietnam`.* TO ‘vietnam’@'192.168.1.114′ |
| GRANT ALL PRIVILEGES ON `vietnam_xxx`.* TO ‘vietnam’@'192.168.1.114′ |
+——————————————————————————————————————+
3 rows in set (0.00 sec)
[!] Thay 192.168.1.114 bằng % để đi đâu cũng vẫn mân mê được đê bê (DB)!!!
December 17th, 2009
admin
Mảng thì to mà thân em MySQL thì nhỏ!
MySQL cho phép chèn nhiều records qua một câu lệnh kiểu như sau
# Câu lệnh insert multiple:
INSERT INTO bảng VALUES (bộ giá trị thứ nhất), (bộ giá trị thứ hai), … (bộ giá trị thứ N);
Vì thế khi đẩy dữ liệu từ mảng vào database ta có thể tạo ra câu lệnh SQL như vậy, thay vì với mỗi phần tử của mảng ta lại tạo ra một bộ và INSERT INTO bảng VALUES (bộ giá trị có được);
Tuy nhiên do cấu hình max_allowed_packet, ta chỉ thực thi được câu lệnh chèn đồng thời 1 phát nhiều bản ghi với chỉ số N giới hạn.
Do đó, code phân tách mảng và generate ra các câu SQL nên làm như sau
<?php
$prefixSQL = 'INSERT INTO phimconheo(id, title, description, source, price, available) VALUES ';
$i = 0;
foreach ($data as $record) {
$id = intval($record['id']);
$title = addslashes($record['title']);
// same above for other fields
$sql .= "($id, $title, $description, $source, $price, $available),";
$i++;
if ($i == LIMIT_EXECUTABLE) {
$sql = substr($sql, 0, strlen($sql) – 1) . ";";
$sql = $prefixSQL . $sql;
echo $sql . "\n";
$i = 0;
$sql = '';
}
}
if ($sql != '') {
$sql = substr($sql, 0, strlen($sql) – 1) . ";";
$sql = $prefixSQL . $sql;
echo $sql . "\n";
}
1. Máy chủ riêng và ta có quyền kiểm soát
Trong trường hợp này có 2 cách
- Nếu database quá lớn, việt xuất ra file .sql là rất bất tiện. Giải pháp : backup bằng cách copy y nguyên thư mục chứa các file của database, khi import lại thì copy vào thư mục chứa database của mysql (db mới thì tạo db trước khi copy, cũ thì copy đè lên). Sau đó CHMOD các file database đúng với owner chạy mysql và restart lại MySql là được.
- Nếu database ở khá lớn ở dạng file *.sql thì dùng lệnh của MySql. Login với quyền root, sau đó change sang database cần import. Lưu ý đến charset của database trước khi import, đặc biệt là hay dùng UTF8. Để set UTF8 chạy lệnh:
mysql> SET NAMES utf8
Sau đó chạy lệnh import:
mysql> source filename;
2. Import từ phía web client (phổ biến)
Giải pháp khá phổ biến và rất hay là dùng BigDump.
Cách làm : download bigdump về,upload file database .sql lên server (ví dụ : test.sql), sau đó up file bigdump.php đã config lên.
Sau đó trên web chạy : you.com/bigdump.php và bấm Start –> ko báo lỗi gì là ok.
Các tham số đáng chú ý với bigdump :
$db_server = ‘localhost’;// –> địa chỉ server
$db_name = ”;// –> tên database
$db_username = ”;// –> user
$db_password = ”; //–> mật khẩu
$filename = ‘test.sql’;// –> tên file database, ở đây là test.sql (Nên để trống)
$db_connection_charset = ‘utf8′;// –> (utf8 hoặc latin1) cái này quan trọng này, nếu không đúng database sẽ rất dễ bị lỗi tiếng Việt