Tập tành làm thám tử với SQL Murder Mystery - Part 1: Truy tìm hung thủ

Tập tành làm thám tử với SQL Murder Mystery - Part 1: Truy tìm hung thủ

Đợt này tự dưng lướt mạng thấy anh em IT đồn thổi cái game SQL Murder Mystery cuốn lắm. Game này cho mình đóng vai thám tử, đi phá một vụ án mạng nhưng thay vì dùng kính lúp soi dấu vân tay thì mình dùng... lệnh SQL. Thấy cũng hay hay nên mình quyết định thử dùng IQ 40 của mình để phá án xem sao.

Câu chuyện bắt đầu bằng một thông tin úp mở: Vào ngày 15 tháng 1 năm 2018, đã xảy ra một vụ giết người ở Thành phố SQL.

Chỉ có thế thôi, không có gì thêm. Đùng 1 phát thả mình vào đống database bự chà bá chả hiểu quần què gì. Nhưng thôi, cứ từ từ bóc tách.

1. Tìm manh mối từ hiện trường

Đầu tiên, phải đọc báo cáo án mạng. Dựa vào ngày tháng và địa điểm, mình moi cái bảng crime_scene_report ra soi:

select * from crime_scene_report
where city = "SQL City" and 
      type = "murder" and 
      date = 20180115;

Kết quả trả về một đoạn mô tả đáng đồng tiền bát gạo:

Các hình ảnh an ninh cho thấy có 2 nhân chứng. Nhân chứng đầu tiên sống tại căn nhà cuối cùng trên đường "Northwestern Dr". Nhân chứng thứ hai, có tên là Annabel, sống ở một nơi nào đó trên đường "Franklin Ave".

Ok, vậy là có 2 người làm chứng. Giờ thì phải đi lùng xem 2 nhân vật này mặt mũi ra sao.

2. Truy tìm nhân chứng

Phân tích 1 xíu nhé: với dữ kiện của nhân chứng 1 là "nhà cuối cùng", tức là số nhà lớn nhất trên đường Northwestern Dr. Mình dùng luôn lệnh max số nhà. Nhân chứng 2 thì có tên "Annabel" và đường Franklin Ave. Dễ xơi!

-- Tìm nhân chứng 1
select * from person
where address_street_name = "Northwestern Dr" and
      address_number in (select max(address_number) from person);

-- Tìm nhân chứng 2
select * from person 
where name like "%Annabel%" and 
      address_street_name = "Franklin Ave";

Bùm! Lòi ra id của 2 nhân vật: ông nội Morty Schapiro (id: 14887) và cô nàng Annabel Miller (id: 16371).

3. Lấy cung nhân chứng

Có id rồi thì lôi cổ lên vắt áo... à nhầm, lôi lên lấy lời khai từ bảng interview. Để nhanh thì mình join cái bảng person với interview luôn cho nó nóng:

select person.name, interview.person_id, interview.transcript 
from person left join interview
on person.id = interview.person_id
where person.id = 14887 or person.id = 16371;

Lời khai lấy được như sau:

Quá ngon! Kẻ sát nhân là nam, là thành viên thẻ gold tập gym lúc ngày 20180109, mã thành viên chứa cú pháp 48Z% và có biển số xe chứa H42W.

4. Bắt giữ hung thủ

Giờ thì vác mấy ông thẻ Vàng của phòng gym ra tra khảo là ra ngay. Ghép thẻ gym và lịch check-in:

select c.membership_id, m.person_id, m.name, c.check_in_date, c.check_in_time, c.check_out_time
from get_fit_now_member m left join get_fit_now_check_in c 
on m.id = c.membership_id and c.check_in_date = 20180109
where membership_status = 'gold' and id like '48Z%';

Ra được 2 nghi phạm là Joe GermuskaJeremy Bowers. Giờ vòng tiếp qua bảng bằng lái xe xem cha nào đi cái xe có biển H42W:

-- So trùng với ID của 2 tên trên bằng cách join ngầm
select dl.*, p.name from drivers_license dl 
join person p on p.license_id = dl.id
where (p.id = 28819 or p.id = 67318) and dl.plate_number like '%H42W%';

Khớp cmn lệnh! Chỉ có Jeremy Bowers là có biển xe chứa ký tự trên do đi con Chevrolet Spark LS. Mình hý hửng Submit kết quả vào game thì nó báo:

Xin chúc mừng! Bạn đã tìm thấy kẻ giết người! Nhưng... hãy thử truy vấn bản ghi phỏng vấn của hắn ta để tìm ra tên tội phạm thực sự đứng sau...

Ôi vãi, hóa ra thằng này chỉ là kẻ thực hiện, phía sau còn có kẻ chủ mưu đứng đầu.

Đến đây cũng mỏi tay gõ phím cmnr. Thui lười quá chả viết nữa, để lúc khác khỏe khỏe thì mình tung nốt Part 2 truy tìm kẻ đứng sau chủ mưu nhé :v