मैंने सर्वेक्षण सॉफ्टवेयर के लिए एक डेटाबेस बनाया। डेटाबेस के दो टेबल हैं जो मैं करना चाहता हूं, मैं दो तारीख सीमाओं और एक स्थान से औसत स्कोर प्राप्त करना चाहता हूं, और बिना उत्तर के शून्य या 0 के रूप में प्राप्त करना चाहता हूं। मैंने कोशिश की

SELECT
    AVG(tbAnswers.averageScore)
FROM
    tbDrivers
LEFT JOIN tbAnswers ON tbDrivers.driverId = tbAnswers.driverId
WHERE
    tbDrivers.place = 'WDC'
GROUP BY
    tbDrivers.driverId 

लेकिन जब मैं दिनांक सीमा निर्दिष्ट करता हूं, तो बिना उत्तर के ड्राइवरों का डेटा नहीं मिलता है।

SELECT AVG(tbAnswers.averageScore)
FROM tbDrivers LEFT JOIN tbAnswers ON tbDrivers.driverId = tbAnswers.driverId
WHERE tbDrivers.place = 'WDC'
      AND answerDate BETWEEN '2018-11-28' AND '2018-12-03'
GROUP BY tbDrivers.driverId

टेबल संरचनाएं: struct

CREATE TABLE `tbAnswers` (
  `answerId` int(11) NOT NULL,
  `answerDate` date NOT NULL,
  `driverId` int(11) NOT NULL,
  `score1` int(11) NOT NULL,
  `score2` int(11) NOT NULL,
  `score3` int(11) NOT NULL,
  `averageScore` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tbAnswers` (`answerId`, `answerDate`, `driverId`, `score1`, `score2`, `score3`, `averageScore`) VALUES
(10, '2018-11-28', 1032, 0, 0, 0, 0),
(11, '2018-11-29', 1032, 9, 8, 3, 6.67),
(12, '2018-11-30', 1032, 0, 3, 2, 1.67),
(13, '2018-11-30', 1035, 10, 2, 10, 7.34),
(14, '2018-11-01', 1032, 5, 5, 5, 5),
(15, '2018-12-03', 1035, 5, 5, 7, 5.67);

CREATE TABLE `tbDrivers` (
  `driverId` int(11) NOT NULL,
  `nameSurname` varchar(32) NOT NULL,
  `place` varchar(64) NOT NULL,
  `plate` varchar(8) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tbDrivers` (`driverId`, `nameSurname`, `place`, `plate`) VALUES
(1032, 'Nick Oliver', 'WDC', 'B16186D'),
(1033, 'Nicholas Keller', 'WDC', 'ACG8095'),
(1034, 'Felipe Mendez', 'WDC', 'C26106E'),
(1035, 'Lowell Butler', 'WDC', '5123QK');

इस समस्या का समाधान किस प्रकार से किया जा सकता है?

1
aliitascan 11 पद 2018, 11:55

2 जवाब

सबसे बढ़िया उत्तर

समस्या उत्पन्न होती है क्योंकि आपके पास tbanswers तालिका में ड्राइवर आईडी के लिए कोई रिकॉर्ड नहीं है।

या तो tbanswers में एक प्रविष्टि करें या ऊपर Forpas द्वारा दी गई क्वेरी का उपयोग करें या इस क्वेरी का उपयोग करें

SELECT tbdrivers.driverid, 
       Avg(tbanswers.averagescore) 
FROM   tbdrivers 
       LEFT JOIN tbanswers 
              ON tbdrivers.driverid = tbanswers.driverid 
WHERE  tbdrivers.place = 'WDC' 
       AND answerdate BETWEEN '2018-11-28' AND '2018-12-03' 
        OR answerdate IS NULL 
GROUP  BY tbdrivers.driverid 
1
Kedar Limaye 11 पद 2018, 13:12

अपनी क्वेरी का उपयोग करें जो उन ड्राइवरों को लाती है जिनके पास कम से कम 1 उत्तर है, UNION वे ड्राइवर जिनके पास कोई उत्तर नहीं है:

(SELECT tbDrivers.driverId, AVG(tbAnswers.averageScore) AS avgscore
FROM tbDrivers LEFT JOIN tbAnswers ON tbDrivers.driverId = tbAnswers.driverId
WHERE tbDrivers.place = 'WDC'
      AND answerDate BETWEEN '2018-11-28' AND '2018-12-03'
GROUP BY tbDrivers.driverId )
UNION 
(SELECT t.driverId,  NULL AS avgscore
FROM tbDrivers t
WHERE
      NOT EXISTS (SELECT 1 FROM tbAnswers WHERE tbAnswers.driverId = t.driverId))
ORDER BY driverId

परिणाम है:

driverId    avgscore
1032        2.7800000111262
1033        (null)
1034        (null)
1035        6.505000114440918
1
forpas 11 पद 2018, 13:14