我在android中有两个表。我创建了所有CRUD操作。但我很难建立他们之间的关系。
所以我有表Recepit,它会有很多日志(来自表Logs)。
如果我创建了Recepit1并且它有例如13个日志,那么我将在列表视图中显示Recepit1,在项目点击时它必须显示这13个日志。
以下是我的Logs and Recepit创建方法。
String CREATE_LOGS_TABLE = "CREATE TABLE " + TABLE_LOGS + " (" +
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_CREATED_AT + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP,"+
KEY_PLATENUMBER + " TEXT, " +
KEY_SORT + " TEXT, "+
KEY_GRADE+ " TEXT, "+
KEY_DIAMETER + " INTEGER, " +
KEY_LENGTH + " INTEGER);";
String CREATE_RECEPITES_TABLE = "CREATE TABLE " + TABLE_RECEPIT + " (" +
RECEPIT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
RECEPIT_PLACE + " TEXT, " + RECEPIT_SHIPPING + " TEXT, " +
RECEPIT_WAREHOUSE + " TEXT, " + RECEPIT_CARRIER + " TEXT, " +
RECEPIT_LICENCE + " TEXT, " + RECEPIT_DRIVER + " TEXT, " +
RECEPIT_CUSTOMER + " TEXT, " + RECEPIT_DEST_WAREHOUSE + " TEXT, " +
RECEPIT_EMPLOYEE + " TEXT, " +
RECEPIT_CREATED_AT + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
问题:
如何设置表Recepit has_many记录的关系?
答案 0 :(得分:2)
我不确定你是否有特殊的东西可以这样做,但是,纯粹在mysql中你可以这样做:
如果两个表之间有1-n关系:
您基本上需要在两个表之一中添加foreign key。这个外键是一个将指向"指向"到另一张桌子
始终使用带有N行的表格指向具有1行的表格,并且最好使用唯一字段来创建外键
Mysql有一个很好的例子
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
PRIMARY KEY (id)
);
您可以在表shirt
中看到,列owner
是对id
表中person
的引用,而id
是PRIMARY KEY
因此是唯一的。
在您的示例中,TABLE_LOGS
应为TABLE_RECEPIT
。
然后,您可以使用简单连接来了解哪些日志属于哪个recepit。
SELECT table_logs.*, table_recepit.id as belongs_to
FROM table_logs LEFT JOIN table_recepit
ON (table_logs.recepit_id = table_recepit.id);
要获取有多个日志有一个收件人,您可以使用GROUP BY
SELECT table_recepit.*, COUNT(table_logs.id) as number_of_logs
FROM table_recepit LEFT JOIN table_logs
ON (table_recepit.id = table_logs.recepit_id)
GROUP BY table_recepit.id;
如果您有n-n关系:
在您的示例中,这意味着一个logs
可以属于许多recepit
,并且一个recepit可以包含许多日志。
在这种情况下,您必须创建一个关系表,以便记录您表格的关系。
此表格如下所示:
CREATE TABLE recepit_to_logs (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
recepit_id INT UNSIGNED NOT NULL REFERENCES table_recepit(id),
logs_id INT UNSIGNED NOT NULL REFERENCES table_logs(id),
PRIMARY KEY (id)
);
希望有所帮助:)
答案 1 :(得分:0)
您可以创建另一个表来维护多对多的关系:)这就是您在RDBMS中维护我们对多个或多对多关系的方法。
如你所说,有两个表1. Logs和2.Reciepts,它们都有主键:)
现在创建一个名为例如LOGS_BELONGS_TO_RECIEPT的表。 该表有两列。 col1:LogsID和col2:ReciptID。两者分别是Logs表和Recipt表的外键引用:)
我的意思是col1:LogsID引用Logs表主键。 col2:ReciptID引用Reciept表主键
因此,每当您输入特定收据的新日志时,您将在此处输入一个条目:)
喜欢LOGS_BELONGS_TO_RECIEPT
RecieptID LogsID
1 L1
1 L2
1 L3
2 L4
2 L5
因此,您可以查询收据表中的所有收据并在列表视图中显示它,当用户点击列表时,从LOGS_BELONGS_TO_RECIEPT获取与之关联的所有日志ID,然后从日志表中查询所有这些日志并显示: )
清洁简单但有效:)不是吗:))
编辑: 好的,这是您可以尝试的查询:)编辑您在评论中粘贴的自己的查询。
public static final String KEY_ID = "id"; //my logs id
public static final String RECEPIT_ID = "id"; //recepit id
CREATE_LOGS_BELONGS_TO_RECEPIT_TABLE = "CREATE TABLE " + TABLE_LOGS_BELONGS_TO_RECEPIT + " (" + RECEPIT_ID + " INTEGER, " + KEY_ID + " INTEGER, FOREIGN KEY("+ RECEPIT_ID +") REFERENCES "+ TABLE_RECEPIT +"("+ RECEPIT_ID +"), FOREIGN KEY("+ KEY_ID +") REFERENCES "+ TABLE_LOGS +"("+ KEY_ID +"));"
此表无需任何主键:)
修改强>
额外点:) 如果要获取与recipt相关的所有日志,则可以编写类似
的查询Select * from TABLE_LOGS where KEY_ID IN (select KEY_ID from LOGS_BELONGS_TO_RECEPIT_TABLE where RECEPIT_ID = 'whatever user tapped');
快乐的编码伙伴:)