协助MySQL JOIN

时间:2012-03-01 23:42:03

标签: mysql join

我有两个表,一个有类别和子类别。每个类别和子类别都有一个id,如果它是一个子类别,它有一个topid != 0引用它的子类别。其他表“标记”有一个字段'cat',它与类别字段'name'相关联现在我想从带有category.id = 4category.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 个答案:

答案 0 :(得分:3)

一个问题是xymply_markers.cat字段是VARCHAR(4),但xymply_categories.name字段是TEXT,并且包含超过4个字符的值。您要么没有给我们准确的架构,要么您对哪些列加入感到困惑,或者您永远不会看到任何卡车或车辆。连接的列应该具有相同的类型,几乎没有例外(我从未见过一个例外的好理由)。

然后您会询问id = 4topid = 4,但您展示的示例数据只有id = 1topid = 1。您确实在系统中有id = 4topid = 4的数据吗?

在这两个混乱之间,我们很难知道我们面临的是什么。如果您的数据已加入且具有相关的topidid值,则您的查询应该有效。


  

我在两个表中都有一个名为'id'的字段。在使用$row = @mysql_fetch_assoc($result)将数据读入数组后,如何控制使用PHP访问哪一个?

最简单的方法是确保每个结果列都有一个唯一的名称,创建一个带有“别名”的名称,如:

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

PHP会将别名与行中的数据相关联。