有mysql关系的麻烦?

时间:2015-04-23 19:55:05

标签: mysql many-to-many relationship one-to-many

我需要两个表,一个使用三个表显示一对多关系,另一个表显示多对多关系。我设法做了前两个是一个只涉及一个表的查询,一个涉及两个表的一个到多个。

一个表查询:

#! /bin/bash
BIGDATA=bigdata/*
SMALLDATA=smalldata
for entry in $BIGDATA
do
    filename=`basename $entry`
    newname=$(echo $filename | awk -F '-' '{print $1 "-" $2 "-10KB.txt"}')
    head -c 1 $entry > $SMALLDATA/$newname
done

涉及2个表格的一对多:

SELECT LastName, FirstName, City 
FROM Customer
WHERE City = 'Lutherville-Timonium'

这是我的代码:

SELECT b.BrandName, m.ModelName
FROM Brand b, Model m
WHERE b.BrandID = m.BrandID

非常感谢任何帮助 感谢。

1 个答案:

答案 0 :(得分:2)

这应该做的工作:

SELECT *
FROM computer c

LEFT OUTER JOIN model m ON m.ModelName = c.ModelName
LEFT OUTER JOIN brand b ON b.BrandID = m.BrandID

您可能希望根据您的要求更改返回的字段。祝这个项目好运。

===更新 - 按照您的要求订购:

SELECT *
FROM brand b

LEFT OUTER JOIN model m ON m.BrandID = b.BrandID
LEFT OUTER JOIN computer c ON c.ModelName = m.ModelName

===更新2号 - 包括新的'平台'表

SELECT *
FROM brand b

LEFT OUTER JOIN model m ON m.BrandID = b.BrandID
LEFT OUTER JOIN computer c ON c.ModelName = m.ModelName
LEFT OUTER JOIN platform p ON p.platformID = c.PlatformID

===更新3号 - 以上涵盖了2,3和4个表的1-many关系。要添加多对多关系,您可能希望查看计算机与发票的关系,因为计算机可以在多个发票中,而发票可以(在现实生活中)包含多台计算机。最初提出的数据结构并不允许这样做。为 InvoiceItem 添加表将实现此目的。

计算机和发票之间的关系可能是多对多的[计算机(很多) - (很多)发票]这是通过在它们之间添加链接表来实现的:

Computer (1)-(Many) InvoiceItem (many)-(1) Invoice

===更新4号 要实现此目的,请从发票表中删除computerID,并使用以下字段添加新表InvoiceItem - InvoiceItemID,InvoiceNumber,ComputerID。然后从数据库中检索发票项的查询将是:

SELECT *
FROM Invoice i
LEFT OUTER JOIN InvoiceItem ii ON ii.InvoiceNumber = i.InvoiceNumber
LEFT OUTER JOIN Computer c ON c.computerID = ii.computerID

您可以将此扩展为包括其他与计算机相关的表格:

SELECT *
FROM Invoice i
LEFT OUTER JOIN InvoiceItem ii ON ii.InvoiceNumber = i.InvoiceNumber
LEFT OUTER JOIN Computer c ON c.computerID = ii.computerID
LEFT OUTER JOIN Model m ON m.ModelName = c.ModelName
LEFT OUTER JOIN Brand b ON b.BrandID = m.BrandID
LEFT OUTER JOIN platform p ON p.platformID = c.PlatformID

如果我真的很挑剔,我会抛弃名称上的链接,如果模型名称略有变化,只需使用ID,查询将不再起作用。使用纯粹的ID可以防止这种情况。