2011-12-30 34 views
6

Làm cách nào tôi có thể sử dụng bí danh cột (lat và lng) của mình từ hai truy vấn phụ để làm cho phép tính khoảng cách bên dưới? Những gì tôi về cơ bản cố gắng làm là để tính toán khoảng cách giữa hai địa điểm bằng cách sử dụng các giá trị kinh độ và vĩ độ. Nhưng bằng cách nào đó bí danh của tôi không thể sử dụng được trong truy vấn, tại sao?Cách sử dụng bí danh cột MySQL để tính toán?

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS lat, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS lng, 
(3959 * acos(cos(radians(41.367682)) * cos(radians('lat')) * cos(radians('lng') -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians('lat')))) AS distance 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY ID 
ORDER BY distance ASC 
+1

Tại sao bạn đặt dấu ngoặc kép và lng trong dấu ngoặc kép trong biểu thức? –

+0

Ứng dụng có chạy mà không có bất kỳ lỗi nào hoặc bạn gặp phải một số lỗi trong khi thực hiện truy vấn này không? – Lion

+0

Dấu ngoặc kép là cần thiết để chạy truy vấn, tôi không nhận được lỗi và mọi thứ được trả về một cách chính xác ngoại trừ việc tính toán khoảng cách trả về cùng giá trị cho tất cả các bản ghi, có nghĩa là các giá trị được nhập không được sử dụng cho bất kỳ thứ gì. Tôi làm gì sai ở đây? – Chris

Trả lời

4

OK, những gì bạn cần làm ở đây là tham gia cùng một bảng (wp_postmeta) hai lần dưới bí danh khác nhau, do đó bạn có thể sử dụng khác nhau 'WHERE' điều kiện. Tôi không có bảng của bạn vì vậy tôi không thể kiểm tra điều này, nhưng đây là cách tiếp cận bạn sẽ muốn sử dụng:

SELECT wp_posts.*, 
    (`alias_1`.meta_value) AS `lat`, 
    (`alias_2`.meta_value) AS `lng`, 
    (3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts 
    LEFT JOIN `wp_postmeta` AS `alias_1` ON wp_posts.ID = alias_1.post_id 
    LEFT JOIN `wp_postmeta` AS `alias_2` ON wp_posts.ID = alias_2.post_id 
WHERE 
    wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'page' 
    AND wp_posts.post_date < NOW() 
    AND `alias_1`.meta_key = 'position' 
    AND `alias_1`.meta_value LIKE '41.%' 
    AND `alias_2`.meta_key = 'position' 
    AND `alias_2`.meta_value LIKE '2.%' 
GROUP BY wp_posts.`ID` 
ORDER BY `distance` ASC 

tôi có thể có một số lỗi cú pháp trong đó, nhưng tôi tin rằng logic là gần đúng. Hãy cho tôi biết nếu các công trình này.

+1

Cảm ơn bạn đã gợi ý! Tôi đã thử truy vấn của bạn nhưng nhận được lỗi tương tự như trước. ** Cột không xác định 'lat' trong 'danh sách trường' **. Có thể các bí danh không thể được tham chiếu trong tính toán không? – Chris

+0

Hmm ... Tôi nghi ngờ điều đó, nhưng hãy tiếp tục và chỉnh sửa truy vấn sao cho cos (radian ('lat')) trở thành cos (radian (' alias_1'.meta_value)) và xem điều gì xảy ra. Tôi kèm theo lat và lng trong backticks j ust cho biện pháp tốt. –

+0

Tôi nghĩ điều đó đã xảy ra! Tôi đang nhận được một truy vấn làm việc bây giờ, và cột khoảng cách là cho tôi kết quả ngay bây giờ, mặc dù tôi không chắc chắn họ là chính xác. Một trong những kết quả đọc "5.89936971664429e-05", có vẻ lạ? – Chris

1

Khi bạn đã tạo bí danh của bạn (mà bạn nên thêm dấu ngoặc kép trước và sau), bạn không nên tham khảo nó như là một chuỗi ... tài liệu tham khảo sau này để bí danh nên được kèm theo trong backticks:

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS 'lat', 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS 'lng', 
(3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY `ID` 
ORDER BY 'distance' ASC 

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

+0

Tôi nhận được lỗi "Cột không xác định 'lat' trong 'danh sách trường' '. Tôi đoán các bí danh không thể được tham chiếu như thế này? – Chris

+0

Ah! Bạn có một vấn đề khác là tốt. Bạn không nên có nhiều câu lệnh chọn trừ khi bạn đang chạy truy vấn phụ. Chỉ cần sử dụng "SELECT wp_posts. *, Wp_postmeta.meta_value là 'lat', wp_postmeta.meta_value như' lng' FROM wp_posts, wp_postmeta WHRE [LIST TẤT CẢ CÁC ĐIỀU KIỆN CỦA BẠN) –

+0

Nhưng tôi cần các giá trị từ các trường đó (lat/lng) cho cách tính toán khoảng cách - do đó các truy vấn con: – Chris