Помощь с MySQL JOIN - PullRequest
       1

Помощь с MySQL JOIN

1 голос
/ 02 марта 2012

У меня есть две таблицы, одна с категориями и подкатегориями. У каждой категории и подкатегории есть идентификатор, и, если это подкатегория, у нее есть topid != 0, указывающая, из какой она подкатегории. Другая таблица «маркеры» имеет поле «cat», которое соотносится с полем категории «name». Теперь я хочу выбрать все из маркеров с category.id = 4 ИЛИ category.topid = 4, поэтому я попытался выполнить этот запрос:

SELECT * FROM `xymply_markers`
JOIN `xymply_categories`
    ON xymply_markers.cat = xymply_categories.name
WHERE xymply_categories.topid=4
    OR xymply_categories.id=4

Что не возвращает мне ничего, даже если у меня есть такие элементы в моей таблице "маркеры". Любая помощь будет оценена!

Схемы таблиц:

`xymply_categories` (
  `id` int(11) NOT NULL auto_increment,
  `topid` int(11) NOT NULL,
  `name` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

`xymply_markers` (
  `created` date NOT NULL,
  `id` int(11) NOT NULL auto_increment,
  `sdate` date NOT NULL,
  `hdate` date NOT NULL,
  `name` varchar(60) NOT NULL,
  `address` varchar(80) NOT NULL,
  `unit` varchar(6) NOT NULL,
  `lat` decimal(10,7) NOT NULL,
  `lng` decimal(10,7) NOT NULL,
  `type` varchar(30) NOT NULL,
  `userid` int(11) NOT NULL,
  `adtext` text NOT NULL,
  `phone` varchar(20) NOT NULL,
  `email` varchar(30) NOT NULL,
  `url` varchar(30) NOT NULL,
  `cat` varchar(4) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=151 DEFAULT CHARSET=utf8 AUTO_INCREMENT=151 ;

Пример данных:

xymply_categories:

id  1
topid 0
name 'vehicle'
--------------
id  2
topid 1
name 'bike'
--------------
id  3
topid 1
name 'truck'

xymply_markers:

id 1
sdate 2012-03-01
hdate 2012-04-01
name 'TEST'
address '1234 TEST'
unit''
lat 49.0
lng -123.0
adtext 'TEST'
phone '1234567890'
email 'email@email.com'
url 'www.url.com'
cat 'bike'

--------------

id 1
sdate 2012-03-01
hdate 2012-04-01
name 'TEST'
address '1234 TEST'
unit''
lat 49.5
lng -123.5
adtext 'TEST'
phone '1234567890'
email 'email@email.com'
url 'www.url.com'
cat 'vehicle'

1 Ответ

3 голосов
/ 02 марта 2012

Одной из проблем является то, что поле xymply_markers.cat имеет значение VARCHAR (4), а поле xymply_categories.name имеет значение TEXT и содержит значения длиннее 4 символов. Либо вы не предоставляете нам точную схему, либо не понимаете, какие столбцы объединяются, или вы никогда не увидите никаких грузовиков или транспортных средств. Столбцы, которые объединяются, должны иметь одинаковый тип почти без исключения (я никогда не видел веских причин для исключения).

Затем вы спрашиваете о id = 4 или topid = 4, но показанные вами примеры данных имеют только id = 1 или topid = 1. У вас есть данные где id = 4 или topid = 4 в системе?

Между этими двумя путаницами трудно понять, с чем мы столкнулись. Если у вас есть данные, которые объединяются и имеют соответствующие значения topid или id, тогда ваш запрос должен работать.


У меня есть поле с именем 'id' в обеих таблицах. Как я могу контролировать, какой из них я получаю с помощью PHP после того, как я прочитал данные в массив с помощью $row = @mysql_fetch_assoc($result)?

Самый простой способ - убедиться, что каждый столбец результатов имеет уникальное имя, создавая его с псевдонимом, как в:

SELECT c.id AS category_id,
       c.topid,
       c.name AS category_name,
       m.id AS marker_id,
       m.name AS marker_name,
       ...

PHP свяжет псевдонимы с данными в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...