Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 7 — JQL Cơ Bản — Tìm Issue Nhanh

JIRA and Confluence for BA Bài 7/60

Mở đầu — vì sao bài này quan trọng

Hãy tưởng tượng bạn là BA của một dự án có hơn 2.000 issue trong JIRA. Sếp hỏi: "Có bao nhiêu Story đang còn dang dở mà chưa ai nhận?" Nếu bạn ngồi cuộn (scroll) qua từng trang board để đếm bằng mắt, bạn sẽ mất nửa buổi sáng và vẫn dễ đếm sai. Đây chính là lúc JQL bước vào cuộc chơi.

JQL — viết tắt của JIRA Query Language — là "ngôn ngữ hỏi" của JIRA. Nó giống như cách bạn dùng một câu lệnh tìm kiếm có cấu trúc để hỏi JIRA: "Cho tôi xem tất cả issue thỏa các điều kiện sau". Thay vì lọc thủ công bằng những dropdown nhỏ trên giao diện, bạn gõ một dòng lệnh và nhận về đúng tập issue mình cần — chính xác, lặp lại được, và chia sẻ được cho cả team.

Với một BA, JQL không phải kỹ năng "có thì tốt" mà là kỹ năng sống còn. Mỗi ngày bạn cần trả lời hàng loạt câu hỏi: việc nào sắp đến hạn, việc nào của tôi, requirement nào còn thiếu thông tin, bug nào liên quan tới module thanh toán. Tất cả những câu hỏi đó đều có thể biến thành một dòng JQL gọn gàng. Khi bạn thành thạo, bạn không còn "đi tìm" issue nữa — bạn "ra lệnh" cho JIRA mang issue tới cho bạn.

Bài này tập trung vào JQL cơ bản: cú pháp nền tảng, các toán tử thiết yếu và cách viết những câu truy vấn đơn giản nhưng hữu dụng để tìm issue nhanh. Đây là viên gạch đầu tiên; các câu truy vấn nâng cao với hàm và logic phức tạp sẽ là chuyện của bài sau. Mục tiêu của hôm nay là: sau khi học xong, bạn có thể tự tin gõ một câu JQL bất kỳ trong vòng vài giây.

Khái niệm cốt lõi

JQL là gì và nằm ở đâu

JQL là ngôn ngữ truy vấn riêng của JIRA, lấy cảm hứng từ SQL nhưng đơn giản hơn nhiều và được thiết kế riêng cho việc tìm issue. Bạn không cần biết lập trình để dùng nó.

Để gõ JQL, bạn vào màn hình Filters → Advanced issue search (hoặc bấm vào ô tìm kiếm rồi chọn chế độ "Advanced" / "JQL"). Trên giao diện JIRA Cloud hiện nay, bạn sẽ thấy một nút chuyển đổi giữa chế độ Basic (dùng dropdown bấm chọn) và JQL (gõ tay). Khi gõ tay, JIRA có tính năng auto-complete — gợi ý tên field và giá trị ngay khi bạn gõ — nên bạn không cần nhớ thuộc lòng mọi thứ.

Cấu trúc một câu JQL

Một câu JQL cơ bản luôn có dạng:

field operator value

Trong đó:

  • field (trường): thuộc tính của issue bạn muốn lọc theo, ví dụ project, status, assignee, priority, issuetype.
  • operator (toán tử): cách so sánh, ví dụ "bằng", "khác", "lớn hơn".
  • value (giá trị): nội dung cần khớp, ví dụ "VCOS", "In Progress", currentUser().
Ví dụ đơn giản nhất:

project = "VCOS"

Câu này nghĩa là: "Trả về tất cả issue thuộc dự án có key là VCOS". Đọc lên nghe rất tự nhiên đúng không? Đó là vẻ đẹp của JQL — nó gần như tiếng Anh có cấu trúc.

Khi muốn nhiều điều kiện cùng lúc, bạn nối chúng bằng từ khóa logic AND hoặc OR:

field operator value [AND field operator value]

Ví dụ:

project = "VCOS" AND status = "In Progress"

Nghĩa là: "Issue thuộc dự án VCOS đang ở trạng thái In Progress".

Các toán tử (operators) thiết yếu

Đây là phần xương sống của bài. Hãy nắm chắc nhóm toán tử sau:

Toán tử so sánh:

  • = : bằng. Ví dụ priority = High.
  • != : khác (không bằng). Ví dụ status != Done (tất cả issue chưa xong).
  • > , < , >= , <= : lớn hơn, nhỏ hơn, lớn hơn hoặc bằng, nhỏ hơn hoặc bằng. Thường dùng với ngày tháng hoặc các field có thứ tự. Ví dụ created >= "2026-01-01".
Toán tử danh sách:
  • IN : thuộc một trong các giá trị liệt kê. Ví dụ status IN ("To Do", "In Progress") — issue đang ở một trong hai trạng thái này.
  • NOT IN : không thuộc nhóm nào trong danh sách. Ví dụ priority NOT IN (Low, Lowest).
Toán tử văn bản:
  • ~ : "chứa" (contains) — dùng tìm kiếm chữ trong field văn bản như summary hoặc description. Ví dụ summary ~ "đăng nhập".
  • !~ : "không chứa".
Toán tử trạng thái rỗng:
  • IS EMPTY / IS NULL : field chưa có giá trị. Ví dụ assignee IS EMPTY — issue chưa ai nhận.
  • IS NOT EMPTY : field đã có giá trị.

Từ khóa logic và thứ tự ưu tiên

  • AND : cả hai điều kiện phải đúng.
  • OR : chỉ cần một trong hai điều kiện đúng.
  • NOT : phủ định một điều kiện.
  • ORDER BY : sắp xếp kết quả. Ví dụ ORDER BY created DESC (mới nhất lên trên), ORDER BY priority ASC.
Một lưu ý cực kỳ quan trọng: AND được ưu tiên xử lý trước OR. Vì vậy khi trộn cả hai, hãy dùng dấu ngoặc đơn () để gom nhóm cho rõ ý — chúng ta sẽ thấy lỗi này ở phần sau.

Một số hàm cơ bản hay dùng

JQL có những "hàm" (function) viết kèm dấu ngoặc, hữu ích ngay cả ở mức cơ bản:

  • currentUser() : người đang đăng nhập. Ví dụ assignee = currentUser() — "việc của tôi".
  • now() : thời điểm hiện tại. Ví dụ due < now() — đã quá hạn.
  • startOfWeek(), endOfWeek() : đầu/cuối tuần, dùng cho các báo cáo theo tuần.

Tình huống thực tế

Tình huống 1 — Tiki: Standup buổi sáng và câu hỏi "việc của tôi đâu?"

Chị Lan là BA trong team sản phẩm thanh toán của một sàn thương mại điện tử kiểu Tiki, dự án có key là PAY. Mỗi sáng trước buổi daily standup lúc 9h, chị cần xem nhanh những issue đang gán cho mình và còn chưa hoàn tất, để chuẩn bị báo cáo. Trước đây chị lọc thủ công và thường bỏ sót.

Chị viết câu JQL:

project = "PAY" AND assignee = currentUser() AND status != Done ORDER BY priority DESC

Diễn giải: lấy issue thuộc dự án PAY, gán cho chính chị (currentUser() tự nhận diện tài khoản đang đăng nhập nên chị không cần gõ tên), chưa ở trạng thái Done, và sắp xếp theo độ ưu tiên giảm dần để việc gấp nằm trên cùng. Chị lưu (save) câu này thành một filter đặt tên "Việc của tôi hôm nay" và ghim lên dashboard.

Bài học rút ra: Dùng currentUser() thay vì gõ tên cứng giúp filter này dùng chung được cho cả team — ai mở cũng thấy việc của chính người đó. Đây là mẹo nhỏ nhưng tiết kiệm rất nhiều công sức nhân bản filter.

Tình huống 2 — Startup Fintech tại TP.HCM: Truy tìm requirement còn thiếu thông tin

Anh Khang là BA tại một startup fintech khoảng 40 người ở Quận 1, dự án LOAN (sản phẩm vay tiêu dùng). Cuối sprint, anh phát hiện đội dev hay phàn nàn rằng nhiều Story "thiếu mô tả, không làm được". Anh muốn rà soát tất cả Story chưa có ai nhận hoặc chưa điền mô tả, để bổ sung trước buổi refinement.

Lần đầu anh viết:

project = "LOAN" AND issuetype = Story AND assignee IS EMPTY OR description IS EMPTY

Kết quả trả về hơn 300 issue — sai bét, vì có cả issue của dự án khác lọt vào. Lý do: AND ưu tiên hơn OR, nên JIRA hiểu câu trên thành "(LOAN và Story và chưa ai nhận) hoặc (bất kỳ issue nào chưa có mô tả)" — vế thứ hai quét toàn bộ hệ thống.

Anh sửa lại bằng dấu ngoặc:

project = "LOAN" AND issuetype = Story AND (assignee IS EMPTY OR description IS EMPTY)

Lần này kết quả còn đúng 18 Story cần xử lý. Anh xuất danh sách, phân công bổ sung, và buổi refinement diễn ra trôi chảy.

Bài học rút ra: Khi trộn AND với OR, luôn dùng dấu ngoặc đơn để gom nhóm đúng ý định. Một dấu ngoặc đặt sai chỗ có thể biến 18 issue thành 300 issue.

Tình huống 3 — Agency phần mềm Đà Nẵng: Báo cáo bug ưu tiên cao cho khách hàng

Chị Mai làm BA tại một công ty outsourcing ở Đà Nẵng, phụ trách dự án SHOP cho một khách hàng Singapore. Khách yêu cầu mỗi chiều thứ Sáu gửi danh sách các bug nghiêm trọng được tạo trong tuần để họ nắm tình hình. Chị cần lọc bug có độ ưu tiên cao hoặc cao nhất, được tạo trong tuần này.

Chị viết:

project = "SHOP" AND issuetype = Bug AND priority IN (High, Highest) AND created >= startOfWeek() ORDER BY created DESC

Diễn giải: dự án SHOP, loại issue là Bug, độ ưu tiên thuộc nhóm High hoặc Highest (dùng IN để gom hai giá trị gọn gàng thay vì viết priority = High OR priority = Highest), được tạo từ đầu tuần đến giờ (startOfWeek() tự tính ra ngày thứ Hai), sắp xếp mới nhất lên trên. Chị lưu filter và mỗi chiều thứ Sáu chỉ cần mở ra, chụp màn hình hoặc export là có báo cáo.

Bài học rút ra: Toán tử IN giúp câu truy vấn ngắn và dễ đọc hơn nhiều so với nối nhiều OR. Kết hợp với các hàm ngày tháng như startOfWeek(), bạn có những báo cáo tự cập nhật theo thời gian mà không cần sửa câu lệnh mỗi tuần.

Hướng dẫn từng bước

Hãy cùng xây một câu JQL hoàn chỉnh từ con số 0. Giả sử mục tiêu của bạn là: "Tìm tất cả Task chưa hoàn thành trong dự án MKT, gán cho tôi, ưu tiên cao, sắp xếp theo hạn chót gần nhất."

Bước 1 — Mở màn hình tìm kiếm nâng cao. Trên thanh menu JIRA, chọn Filters → View all filters → Advanced issue search, hoặc gõ trực tiếp vào ô search rồi chuyển sang chế độ JQL. Bạn sẽ thấy một ô nhập trống, nơi gõ câu truy vấn.

Bước 2 — Bắt đầu với điều kiện rộng nhất. Luôn khoanh vùng dự án trước để giảm số lượng issue:

project = "MKT"
Bấm Enter và xem kết quả — đây là toàn bộ issue dự án MKT.

Bước 3 — Thêm dần từng điều kiện bằng AND. Giới hạn loại issue và độ ưu tiên:

project = "MKT" AND issuetype = Task AND priority = High
Mỗi lần thêm điều kiện, chạy lại để chắc chắn kết quả thu hẹp đúng hướng. Đây là thói quen vàng: xây từng bước, kiểm tra từng bước.

Bước 4 — Thêm điều kiện người gán và trạng thái.

project = "MKT" AND issuetype = Task AND priority = High AND assignee = currentUser() AND status != Done

Bước 5 — Sắp xếp kết quả. Thêm ORDER BY ở cuối để việc đến hạn sớm nằm trên:

project = "MKT" AND issuetype = Task AND priority = High AND assignee = currentUser() AND status != Done ORDER BY due ASC

Bước 6 — Tận dụng auto-complete. Trong lúc gõ, JIRA sẽ bật danh sách gợi ý tên field và giá trị hợp lệ. Hãy chọn từ gợi ý thay vì gõ tay — vừa nhanh vừa tránh sai chính tả tên status hay priority.

Bước 7 — Lưu thành filter. Khi câu truy vấn chạy đúng, bấm Save as và đặt tên dễ hiểu, ví dụ "Task gấp của tôi - MKT". Từ giờ bạn chỉ cần mở filter này, không phải gõ lại. Bạn cũng có thể chia sẻ filter cho đồng nghiệp.

Lỗi thường gặp & mẹo

Lỗi 1 — Quên dấu ngoặc kép cho giá trị có khoảng trắng. status = In Progress sẽ báo lỗi vì JIRA không hiểu chỗ ngắt. Phải viết status = "In Progress". Quy tắc: giá trị có dấu cách hoặc ký tự đặc biệt thì bọc trong dấu nháy.

Lỗi 2 — Nhầm thứ tự ưu tiên giữa ANDOR. Như tình huống của anh Khang ở trên: AND chạy trước OR. Luôn dùng dấu ngoặc () khi trộn hai loại để diễn đạt đúng ý.

Lỗi 3 — Dùng project name thay vì project key. Nhiều bạn viết project = "Hệ thống thanh toán" nhưng tên dự án dài dễ gõ sai. An toàn nhất là dùng key viết hoa, ví dụ project = "PAY". Key luôn cố định và ngắn gọn.

Lỗi 4 — Lẫn lộn = với ~ khi tìm văn bản. summary = "đăng nhập" chỉ khớp khi tiêu đề đúng y hệt chuỗi đó. Muốn tìm tiêu đề có chứa chữ "đăng nhập", phải dùng summary ~ "đăng nhập". Đây là lỗi rất phổ biến khiến kết quả trả về rỗng dù bạn chắc chắn issue tồn tại.

Lỗi 5 — So sánh trạng thái rỗng bằng =. Không viết assignee = null hay assignee = "". JQL dùng cú pháp riêng: assignee IS EMPTY hoặc assignee IS NOT EMPTY.

Mẹo 1 — Xây từ rộng đến hẹp. Bắt đầu bằng project = ..., sau đó thêm dần điều kiện. Cách này giúp bạn luôn kiểm soát được số lượng kết quả và phát hiện sai sót sớm.

Mẹo 2 — Tin vào auto-complete. Đừng gõ tên status, priority, hay assignee từ trí nhớ. Để JIRA gợi ý — bạn sẽ tránh được phần lớn lỗi gõ sai.

Mẹo 3 — Lưu mọi câu truy vấn bạn dùng lại từ hai lần trở lên. Mỗi filter đã lưu là một "phím tắt" tiết kiệm thời gian. Đặt tên rõ ràng theo mục đích, không đặt kiểu "filter 1", "filter 2".

Mẹo 4 — Đọc câu JQL thành tiếng Việt để kiểm tra logic. Trước khi chạy, đọc to: "Dự án PAY, và của tôi, và chưa xong". Nếu đọc lên nghe đúng ý định, câu lệnh thường cũng đúng.

Bài tập thực hành

Hãy mở JIRA (hoặc một site dùng thử miễn phí của Atlassian) và tự viết các câu JQL sau. Cố gắng gõ trước, rồi mới đối chiếu gợi ý.

  • Tìm tất cả issue thuộc dự án có key VCOS đang ở trạng thái "To Do".
Gợi ý: project = "VCOS" AND status = "To Do"

  • Tìm tất cả Bug có độ ưu tiên High hoặc Highest trong dự án SHOP, dùng toán tử IN.
Gợi ý: project = "SHOP" AND issuetype = Bug AND priority IN (High, Highest)

  • Tìm tất cả issue gán cho chính bạn mà chưa hoàn thành, sắp xếp theo ngày tạo mới nhất.
Gợi ý: assignee = currentUser() AND status != Done ORDER BY created DESC

  • Tìm tất cả Story chưa có ai nhận (assignee còn trống) trong dự án LOAN.
Gợi ý: project = "LOAN" AND issuetype = Story AND assignee IS EMPTY

  • Thử thách: Tìm tất cả issue trong dự án MKT là Task hoặc Story (dùng IN), có độ ưu tiên không phải Low, và tiêu đề chứa chữ "landing page". Đừng quên dùng ngoặc nếu cần.
Gợi ý: project = "MKT" AND issuetype IN (Task, Story) AND priority != Low AND summary ~ "landing page"

Sau khi viết xong, hãy lưu ít nhất một câu thành filter và đặt tên cho nó. Đây là bước biến kiến thức thành thói quen làm việc thật.

Tóm tắt

JQL là công cụ giúp BA biến những câu hỏi hằng ngày thành các truy vấn chính xác, lặp lại được. Cấu trúc nền tảng luôn là field operator value, nối nhiều điều kiện bằng AND / OR, và sắp xếp bằng ORDER BY.

Những điểm cốt lõi cần nhớ:

  • Nắm chắc nhóm toán tử: so sánh (=, !=, >, <, >=, <=), danh sách (IN, NOT IN), văn bản (~), và rỗng (IS EMPTY, IS NOT EMPTY).
  • AND ưu tiên trước OR — luôn dùng dấu ngoặc () khi trộn hai loại.
  • Dùng currentUser() để câu lệnh "việc của tôi" dùng chung được cho cả team.
  • Xây câu truy vấn từ rộng đến hẹp, tận dụng auto-complete, và lưu lại mọi filter dùng nhiều lần.
Khi bạn đã quen với JQL cơ bản, việc tìm issue không còn là gánh nặng mà trở thành phản xạ. Ở bài tiếp theo, chúng ta sẽ nâng cấp lên các câu truy vấn nâng cao — với hàm phức tạp, truy vấn theo thời gian linh hoạt và logic lồng nhau — để giải quyết những bài toán báo cáo khó hơn. Nhưng nền móng vững chắc bạn xây hôm nay chính là chìa khóa cho mọi thứ phía trước.