Левое соединение, ISNULL, IFNULL не работают

CREATE TABLE IF NOT EXISTS `tblflash` (
  `FID` int(11) NOT NULL AUTO_INCREMENT,
  `fname` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`FID`)
) 

CREATE TABLE IF NOT EXISTS `tblcount` (
  `ID` int(50) NOT NULL AUTO_INCREMENT,
  `SID` int(50) NOT NULL,
  `FID` int(11) NOT NULL,
  `sDateTime` datetime NOT NULL,
  `elaspedTime` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
)


$sqldate1 =
    "SELECT distinct tblflash.FID, tblflash.fname, IFNULL(sum(tblcount.elaspedTime),0)
    FROM tblflash 
    left outer JOIN tblcount 
    ON tblflash.FID = tblcount.FID 
    WHERE tblcount.SID='".$_SESSION['SID']."'
    ORDER BY tblflash.FID"; 

скажем, в tblflash есть 10 строк, 10 строк и 5 строк в tblcount. показанная запись отображается только в 5 строках. Я хотел бы показать все fname без дублирования, и если null установлен в 0.

Что случилось?


person rex    schedule 26.02.2013    source источник


Ответы (3)


Ваш WHERE tblcount.SID='".$_SESSION['SID']."' заставляет запрос действовать как INNER JOIN — вам нужно добавить or tblcount.SID IS NULL

person cjk    schedule 27.02.2013

Ваше условие WHERE применяется к результату объединения, не конкретно к tblcount строкам. И объединение возвращает NULL во всех столбцах tblcount, когда между двумя таблицами нет совпадений. В результате NULL = 'whatever' не оценивается как true, и строка не возвращается.

Либо добавьте OR tblcount.SID IS NULL в WHERE, как @cjk предложил, либо сделайте условие WHERE частью предложения ON, например:

$sqldate1 =
    "SELECT distinct tblflash.FID, tblflash.fname, IFNULL(sum(tblcount.elaspedTime),0)
    FROM tblflash 
    left outer JOIN tblcount 
    ON tblflash.FID = tblcount.FID 
    AND tblcount.SID='".$_SESSION['SID']."'
    ORDER BY tblflash.FID"; 
person Andriy M    schedule 28.02.2013

Нет данных для SID в tblcount для других 5 строк

person shibormot    schedule 27.02.2013