разные результаты выборки при использовании кавычек для цыфры, например 1 или "1"

  • Автор темы denmayday
  • Дата начала

denmayday

Guest
разные результаты выборки при использовании кавычек в значении поля (1 или "1")

Добрый день.

Вкратце: при выборке из двух таблиц с ипользованием left join если в условии объединения таблиц указать значение поля 1 (без кавычек), то выбираются одни данные, если указать "1" (с кавычками), то другие данные.

Подробнее:

Есть таблица test_images с данными:

ID NAME
11 img_11
12 img_12
21 img_21
22 img_22
31 img_31
32 img_32
41 img_41
42 img_42

где ID - id изображения, NAME - ее имя

дамп данных такой:

PHP:
CREATE TABLE test_images (
  ID int(11) NOT NULL auto_increment,
  NAME varchar(128) NOT NULL default '',
  PRIMARY KEY  (ID)
) TYPE=MyISAM;

INSERT INTO test_images (ID, NAME) VALUES 
(11, 'img_11'),
(12, 'img_12'),
(21, 'img_21'),
(22, 'img_22'),
(31, 'img_31'),
(32, 'img_32'),
(41, 'img_41'),
(42, 'img_42');
и таблица связи изображений с галереями test_gallery_to_images

ID GID IMG FRONT
1 1 11 1
2 1 12 0
3 2 21 0
4 2 22 1
5 3 31 0
6 3 32 1
7 4 41 1
8 4 42 0

ID - id связи, GID - id галереи, IMG - id изображения, FRONT - идентификатор вывода изображения по умолчанию (лицевое изображение)

Дамп:

PHP:
CREATE TABLE test_gallery_to_images (
  ID int(11) NOT NULL auto_increment,
  GID int(11) NOT NULL default '0',
  IMG int(11) NOT NULL default '0',
  FRONT enum('0','1') NOT NULL default '0',
  PRIMARY KEY  (GID,IMG),
  UNIQUE KEY ID (ID)
) TYPE=MyISAM;

INSERT INTO test_gallery_to_images (ID, GID, IMG, FRONT) VALUES 
(1, 1, 11, '1'),
(2, 1, 12, '0'),
(3, 2, 21, '0'),
(4, 2, 22, '1'),
(5, 3, 31, '0'),
(6, 3, 32, '1'),
(7, 4, 41, '1'),
(8, 4, 42, '0');
Делается запрос для подсчета изображений и вывода изображений по умолчанию:

PHP:
SELECT IFNULL(COUNT(gti.IMG),"0") as COUNT, gti.GID, gi.ID as IMG, gi.NAME
FROM test_gallery_to_images  as gti
LEFT JOIN test_images as gi ON (gi.ID = gti.IMG AND gti.FRONT = "1")
GROUP BY gti.GID
При указании gti.FRONT = "1" (с кавычками) возвращается такой результат:

COUNT GID IMG NAME
2 1 11 img_11
2 2 NULL NULL
2 3 NULL NULL
2 4 41 img_41

а при указании gti.FRONT = 1 (без кавычек), такой:

COUNT GID IMG NAME
2 1 NULL NULL
2 2 21 img_21
2 3 31 img_31
2 4 NULL NULL

Подскажите пожалуйста в чем проблема и как выбрать все изображения с gti.FRONT = 1?

З.Ы. PHP Version 4.3.10, Apache 2.0, MySQL 4.1.10.
 

denmayday

Guest
zerkms
только что проверил на Apache/2.2.6 (FreeBSD), PHP/5.2.5, MySQL 5.0.51 - результат не изменился.
 

SelenIT

IT-лунатик :)
Запрос неверный. При выборке поля одной из сгруппированных записей MySQL вправе выбирать эту запись совершенно произвольным образом - что мы и видим. Поскольку используется LEFT JOIN, условие в скобках вообще ни на что не влияет, а в выборке может оказаться NULL.

Имхо, LEFT JOIN тут не нужен - достаточно INNER-а по условию gi.ID = gti.IMG. А вытянуть картинку по умолчанию можно либо извратной агрегатной ф-цией типа GROUP_CONCAT( IF( gti.FRONT = "1", gi.NAME, '') SEPARATOR ''), либо для этого придется еще раз отдельно приджойнить таблицу test_gallery_to_images...
 
Сверху