2013-06-25 7 views
6

द्वारा अलग-अलग मान आदेश का चयन MySQL (मैं अंग्रेजी बहुत अच्छी तरह से बात नहीं सकते, लेकिन मैं पूरी कोशिश करता हूँ)datetime

मैं दो तालिकाओं की है।

table1

 
id carid user 
--------------------- 
1 | A001 | user1 
2 | A002 | user1 
3 | A003 | user2 
4 | A002 | user3 

table2

 
id carid  datetime   lat  lon 
---------------------------------------------------- 
1 | A001 | 2013-25-06 10:00:00 | -23.0000 | -46.0000 
2 | A002 | 2013-25-06 10:01:00 | -24.3500 | -45.3200 
3 | A002 | 2013-25-06 10:02:00 | -24.3800 | -45.3300 
4 | A001 | 2013-25-06 10:05:00 | -23.0500 | -46.1000 
5 | A003 | 2013-25-06 10:07:00 | -24.3500 | -45.3200 
6 | A001 | 2013-25-06 10:10:00 | -23.0700 | -46.1200 

मैं "user1" से "carid" datetime

परिणाम द्वारा आदेश दिया प्रत्येक विशिष्ट रजिस्ट्री चयन करने की आवश्यकता मैं की जरूरत है:

 
    carid   datetime   lat  lon 
-------------------------------------------------- 
    A001 | 2013-25-06 10:10:00 | -23.0700 |-46.1200 
    A002 | 2013-25-06 10:02:00 | -24.3800 |-45.3300 

जिस तरह से मैं वास्तव में बना रहा हूं, मैं जिस उपयोगकर्ता को चाहता हूं उससे सभी "कैरिड" का चयन कर रहा हूं, और प्रत्येक पंक्ति को व्यक्तिगत रूप से .NET के माध्यम से चुन रहा हूं। मैं querys का एक बहुत कुछ करना है कि उपयोगकर्ता से "carid के"

SELECT * FROM table2 WHERE car_id='A001' ORDER BY datetime DESC limit 1 
SELECT * FROM table2 WHERE car_id='A002' ORDER BY datetime DESC limit 1 

लेकिन रजिस्ट्रियों की संख्या के आधार:

`SELECT carid FROM table1 where user = “user1”;` 
 
carid 
----- 
A001 
A002 

तब पंक्ति मैं चाहता हूँ का चयन। मैं अगर यह एक एकल का चयन करें जिस तरह से मैं कर रहा हूँ में सुधार के साथ ऐसा करना संभव है पता नहीं है, लेकिन यह है कि मैं क्या कोशिश की है है:

SELECT car_id, datetime, lat, lon from table1 
INNER JOIN table2 on carid = car_id 
WHERE user = 'user1' 
GROUP BY carid 
ORDER BY datetime DESC; 

परिणाम:

 
carid datetime   lat   lon 
------------------------------------------------------ 
A002 | 2013-25-06 10:01:00 | -24.3500 | -45.3200 
A001 | 2013-25-06 10:02:00 | -23.0000 | -46.0000 

और

SELECT car_id, MAX(datetime) as datetime, lat, lon from table1 
INNER JOIN table2 on carid = car_id 
WHERE user = 'user1' 
GROUP BY carid 
ORDER BY datetime DESC; 

परिणाम::

01 मैं भी इस की कोशिश की
 
carid  datetime   lat   lon 
------------------------------------------------------ 
A001 | 2013-25-06 10:10:00 | -23.0000 | -46.0000 
A002 | 2013-25-06 10:02:00 | -24.3500 | -45.3200 

लेकिन परिणाम मुझे मिला गलत है। मुझे नहीं पता कि सभी पंक्तियों का चयन किए बिना क्या करना है, जो कि वास्तव में इसे बनाने के तरीके से धीमा तरीका है।

कोई विचार?

+2

तालिका डेटा के साथ एक अच्छी तरह से लिखित प्रश्न के लिए +1, और आपने अपनी समस्या को हल करने का प्रयास कैसे किया। – Taryn

उत्तर

6

आप दो बार table2 पर शामिल हो सकते हैं, एक बार प्रत्येक carId के लिए max(datetime) और प्राप्त करने के लिए दूसरे को पाने के लिए lat और loncarId और datetime के साथ जुड़े:

select t1.carid, t2.datetime, t2.lat, t2.lon 
from table1 t1 
inner join 
(
    -- get the lat/lon associated with each carid and max datetime 
    select t2.carid, t2.datetime, t2.lat, t2.lon 
    from table2 t2 
    inner join 
    (
    -- get the max datetime for each carid 
    select carid, max(datetime) datetime 
    from table2 
    group by carid 
) d 
    on t2.carid = d.carid 
    and t2.datetime = d.datetime 
) t2 
    on t1.carid = t2.carid 
where user = 'user1'; 

SQL Fiddle with Demo देखें।

max() गलत lat और lon मूल्यों लौट रहा था क्योंकि आप केवल carid द्वारा समूहीकरण कर रहे हैं ताकि MySQL मनमाने ढंग से चयन सूची में स्तंभों कि एक समग्र समारोह या एक समूह द्वारा में नहीं हैं के लिए मान चुन सकते हैं के साथ आपकी क्वेरी। यह व्यवहार MySQL's Extensions to GROUP BY के कारण है।

MySQL डॉक्स से:

MySQL तो द्वारा समूह के उपयोग कि चयन सूची nonaggregated कॉलम GROUP BY क्लॉज़ में नामित नहीं उल्लेख कर सकते हैं प्रदान करता है। ... आप अनावश्यक कॉलम सॉर्टिंग और ग्रुपिंग से बचकर बेहतर प्रदर्शन प्राप्त करने के लिए इस सुविधा का उपयोग कर सकते हैं। हालांकि, यह मुख्य रूप से उपयोगी होता है जब ग्रुप BY में नामित प्रत्येक गैर-समेकित कॉलम में सभी मान प्रत्येक समूह के लिए समान नहीं होते हैं। सर्वर प्रत्येक समूह से किसी भी मूल्य का चयन करने के लिए स्वतंत्र है, इसलिए जब तक वे समान नहीं हैं, तो चुने गए मान अनिश्चित हैं। इसके अलावा, प्रत्येक समूह के मूल्यों का चयन खंड द्वारा ऑर्डर करके प्रभावित नहीं हो सकता है। परिणाम सेट का क्रमबद्ध होना मानों के चयन के बाद होता है, और ORDER BY यह प्रभावित नहीं करता कि सर्वर कौन से मान चुनता है।

यह सुनिश्चित करने के लिए कि आप सही मान वापस कर लें, आप उपर्युक्त के समान उपखंड का उपयोग करना चाहेंगे।

+0

आपके द्वारा जवाब देने के लिए धन्यवाद। इस तरह वास्तव में जिस तरह से मैं चाहता था, वैसे ही काम करता है, लेकिन दुर्भाग्यवश, मैं समझाने के तरीके से अधिक समय लेता हूं। उत्तर के रूप में चिह्नित। – Sagevalle

+0

@Sagevalle क्या आपके पास अपनी टेबल पर कोई अनुक्रमणिका है? – Taryn

+0

हां, ** तालिका 1 ** 'कैर्किड' और'user 'में, और ** तालिका 2 **'carid' में। – Sagevalle

0

मुझे लगता है कि निम्नलिखित प्रश्न आपके परिदृश्य के लिए काम करना चाहिए। मैंने कोशिश नहीं की है क्योंकि मेरे पास डेटा नहीं है।

SELECT 
    t1.carid, t2.datetime, t2.lat, t2.lon 
FROM 
    table1 t1 JOIN table2 t2 
    ON t1.carid = t2.carid AND t1.user='user1' 
GROUP BY 
    carid 
HAVING 
    t2.datetime=MAX(datetime); 

मुझे यह बताएं कि यह काम करता है या नहीं।

+0

यह काम नहीं किया। – Sagevalle