有一个名为PIVOT的功能,它可以做你想做的,但不幸的是,它在MySQL中不可用。
你可以但是做什么,是串连所有类型为每个类别一个字符串:
SELECT
a.name,
GROUP_CONCAT(b.name) AS types
FROM
category a
LEFT JOIN
types b ON a.type = b.id
GROUP BY
a.id
这将导致类似:
name | types
--------------------------------
a | TypeA
b | TypeB
c | TypeA,TypeB,TypeC,TypeD
凡c类有四种不同的类型,但a和b只有一种类型与它们相关联。
如果你预先知道多少type是你要去检查,并想在该类型存在的类别以显示一个布尔值,你可以这样做:
SELECT,
a.name,
b.id IS NOT NULL AS TypeA,
c.id IS NOT NULL AS TypeB,
-- etc...
FROM
category a
LEFT JOIN
types b ON a.type = b.id AND b.id = 1
LEFT JOIN
types c ON a.type = c.id AND c.id = 2
-- etc...
编辑:如果您不知道预先创建的列的数量,但仍然希望在各自的单独列中为每种类型设置布尔值,那么另一种选择是在应用程序逻辑中动态构建查询字符串。假设您使用的是PHP例如:
$columns = $ljoins = array();
$i = 1;
foreach($pdo->query('SELECT id, name FROM types') as $row)
{
$columns[] = "t$i.id IS NOT NULL AS " . $row['name'];
$ljoins[] = "LEFT JOIN types t$i ON a.type = t$i.id AND t$i.id = " . $row['id'];
$i++;
}
$sql = 'SELECT a.name, ' . implode(', ', $columns) . ' FROM category a ' . implode(' ', $ljoins);
$stmt = $pdo->query($sql);
// Do stuff with result-set