Tôi có một cơ sở dữ liệu MySQL có mã bưu điện trong đó, đôi khi trong cơ sở dữ liệu có các không gian trong mã bưu điện [ví dụ: Ng1 1AB] Đôi khi không có [ví dụ: NG11AB]. Simlarly trong truy vấn PHP để đọc từ cơ sở dữ liệu mà người tìm kiếm cơ sở dữ liệu có thể thêm không gian hoặc không. Tôi đã thử các định dạng khác nhau bằng cách sử dụng giống như nhưng dường như không thể tìm thấy một phương tiện tìm kiếm hiệu quả để kết thúc nó sẽ đưa ra cùng một hàng tương ứng [ví dụ: tìm kiếm NG11AB hoặc NG1 1AB để đưa ra 'Bob Smith' ' hoặc bất kể trường hàng tương ứng sẽ là gì].
Bất kỳ đề xuất?
Hỏi ngày 30 tháng 8 năm 2013 lúc 8:52Aug 30, 2013 at 8:52
1
Tôi thậm chí sẽ không bận tâm với LIKE
hoặc regex và chỉ cần loại bỏ khoảng trống và so sánh các chuỗi:
SELECT *
FROM mytable
WHERE LOWER[REPLACE[post_code_field, ' ', '']] = LOWER[REPLACE[?, ' ', '']]
Lưu ý rằng tôi cũng chuyển đổi cả hai giá trị thành chữ thường để vẫn khớp chính xác nếu người dùng nhập mã POST chữ thường.
Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:57Aug 30, 2013 at 8:57
Aleks Galeks gAleks G
55.4K27 Huy hiệu vàng163 Huy hiệu bạc257 Huy hiệu Đồng27 gold badges163 silver badges257 bronze badges
6
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
Đảm bảo đầu vào PHP của bạn cũng được cắt
Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:56Aug 30, 2013 at 8:56
AnonymooseanonymouseAnonymoose
2.3496 Huy hiệu vàng35 Huy hiệu bạc68 Huy hiệu Đồng6 gold badges35 silver badges68 bronze badges
1
Giả sử cột của bạn không chỉ là mã bưu điện trong đó: Xóa tất cả các khoảng trống trước khi thực hiện kiểm tra tương tự:
where replace[postcode, ' ', ''] like '%NG11AB%'
Nếu các cột của bạn chỉ có mã bưu điện trong đó:
where replace[postcode, ' ', ''] = 'NG11AB'
hoặc
where postcode like 'N%G%1%1%A%B'
Regex sẽ làm việc cho cả hai trường hợp. Regex sau đây cho phép các không gian tùy chọn giữa mỗi chữ cái:
where postcode rlike 'N ?G ?1 ?1 ?A ?B' -- use regex
Đã trả lời ngày 30 tháng 8 năm 2013 lúc 8:56Aug 30, 2013 at 8:56
Anonymooseanonymouse♦Bohemian
2.3496 Huy hiệu vàng35 Huy hiệu bạc68 Huy hiệu Đồng89 gold badges565 silver badges702 bronze badges
Bạn đã bao giờ viết một tìm kiếm cho MySQL và gặp vấn đề trong đó tìm kiếm sẽ xử lý không gian đúng cách chưa?
Tôi đã viết một tìm kiếm cho một bảng users
và muốn tìm người dùng bằng tên hoặc họ của họ hoặc kết hợp cả hai.
Tôi bắt đầu với một truy vấn như thế này:
SELECT * FROM `users`
WHERE LOWER[`users`.`first_name`]
LIKE LOWER[:searchTerm]
OR LOWER[`users`.`last_name`]
LIKE LOWER[:searchTerm]
Dưới đây là danh sách cho các trận đấu, cho rằng có một người dùng với
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
0 của James James và SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
1 của Hồi Doyle,:- "%James%" - phù hợpmatch
- "%Doyle%" - phù hợpmatch
- "%James D%" - không phù hợp
- "%J doyle%" - không phù hợp
- "%James Doyle%" - không phù hợp
Vấn đề xuất hiện khi bạn thêm không gian vào truy vấn tìm kiếm. Tôi đã không muốn chia từ này thành một mảng và thực hiện tìm kiếm cho từng từ. Điều đó sẽ yêu cầu truy vấn cơ sở dữ liệu nhiều lần. Và tôi không muốn cố gắng thực hiện
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
2 và tất cả các bản hack chuỗi này để có được điều này để phù hợp chính xác hơn.Chà, tôi đã tìm thấy thủ thuật này, nơi bạn có thể tạo các cột giả bằng cách sử dụng
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
3 và sau đó thay thế bất kỳ ký tự không gian nào bằng SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
4.Vì vậy, nếu tôi hỏi như thế này:
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
5, điều đó thực sự sẽ trở thành SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
6 khi nó đến SQL thực tế nơi truy vấn.Điều này cho phép bạn có được một kết hợp tốt hơn thường xuyên hơn nếu người dùng gõ nhiều nội dung hơn trong một truy vấn có không gian.
SELECT * FROM `users`
WHERE
LOWER[CONCAT[`users`.`first_name`,`users`.`last_name`]]
LIKE LOWER[REPLACE[:searchTerm, " ", "%"]]
Dưới đây là danh sách các thuật ngữ sẽ được khớp trong truy vấn này:
- "%James%" - phù hợpmatch
- "%Doyle%" - phù hợpmatch
- "%James D%" - không phù hợpmatch
- "%J doyle%" - không phù hợpmatch
- "%James Doyle%" - không phù hợpmatch
Vấn đề xuất hiện khi bạn thêm không gian vào truy vấn tìm kiếm. Tôi đã không muốn chia từ này thành một mảng và thực hiện tìm kiếm cho từng từ. Điều đó sẽ yêu cầu truy vấn cơ sở dữ liệu nhiều lần. Và tôi không muốn cố gắng thực hiện SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
2 và tất cả các bản hack chuỗi này để có được điều này để phù hợp chính xác hơn.
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
Chà, tôi đã tìm thấy thủ thuật này, nơi bạn có thể tạo các cột giả bằng cách sử dụng
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
3 và sau đó thay thế bất kỳ ký tự không gian nào bằng SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
4.Vì vậy, nếu tôi hỏi như thế này:
SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
5, điều đó thực sự sẽ trở thành SELECT *
FROM MYTABLE
WHERE REPLACE[MYTABLE.POSTCODE, ' ', ''] LIKE '%input%'
6 khi nó đến SQL thực tế nơi truy vấn.