[英]How to get specific id's from different MySQL Tables
我知道這聽起來很糟糕,但是我找不到表達我所需要的方法。我目前正在構建一個類,通過從2個不同的ID中獲取ID,來檢查同一事件中同一張票是否被“擊中”了一個籃球隊。我的數據庫由3個表組成。第一個是“門票”表,用戶可以在其中輸入姓名,年份和門票名稱;第二個是“事件”表,用戶可以在其中輸入籃球賽事和年份現在最后一張桌子讓我感到困惑(我已經檢查了同一年是否發生了同一事件,因為不可能在同一座體育場舉行兩次冠軍賽)。出現在同一事件上,這就是我想要做的。
第三張表是“檢查”表。 我有3個整數變量(id,ticket_id,event_id),我想從門票表和第1列(這是自動遞增的ID)中獲取ticket_id,並對事件表中的event_id進行相同操作(第1列是id當然)。
然后,我要檢查並確保它們不匹配超過1次,並返回一個布爾值。
到目前為止,這就是我提出的內容。
PS對不起,很長的帖子,但我對此感到困惑...
import java.sql.ResultSet;
import java.sql.SQLException;
public class check {
private int ticket_id,event_id;
public int getTicket_id() {
return ticket_id;
}
public void setTicket_id(int ticket_id) {
this.ticket_id = ticket_id;
}
public int getEvent_id() {
return event_id;
}
public void setEvent_id(int event_id) {
this.event_id = event_id;
}
public check(int ticket_id, int event_id) {
super();
this.ticket_id = ticket_id;
this.event_id = event_id;
}
public boolean checkExistance_3 (){
String errMsg = "";
// class that connects with the MySQL DB
ServerConn sc = new ServerConn();
String sql3 = "SELECT Count(*) AS RowCount FROM events INNER JOIN tickets on tickets.id = events.id WHERE tickets.id = '" + ticket_id + "' AND events.id =" + event_id ;
// HOW TO GIVE VALUES AT ticket_id and event_id??? this is my problem
// I dont now if a need a SELECT with rs.next() because it would return all id's!
// class that executes queries
ResultSet rs3 = sc.dbQuery(sql3);
if (errMsg.equals(""))
{
try {
rs3.next();
int rows = rs3.getInt("RowCount");
} catch (SQLException case1) {
case1.printStackTrace();
} catch (Exception case2) {
case2.printStackTrace();}
return true;
}
return false;
}
}
我選擇不介紹其他4個類的工作方式,因為這會更加令人困惑。 如果需要另外一個類來澄清問題,我將其添加到我的帖子中。
門票表
活動表
我創建了一個在第3個表上保存ID的類,但是sql和sql_1語句中的變量無法解析,因為它們屬於不同的類。 是否可以從不同的類繼承變量?
public String SaveId() {
String errMsg2 = "";
if ( errMsg2.equals("") ) {
try
{
ServerConn sc = new ServerConn();
// sql_game and ticketNumber appear on other classes. Can I inherit them?
// wont find the variables, error.
String sql = "SELECT (id) FROM events WHERE decsrp = '" + sql_game + "'";
String sql_1 = "SELECT (id) FROM tickets WHERE ticket = '" + ticketNumber + "'";
ResultSet rs = sc.dbQuery(sql);
ResultSet rs_1 = sc.dbQuery(sql_1);
boolean allowed = true;
while (rs.next())
allowed = false;
while (rs_1.next())
allowed = false;
if (allowed == true)
{
try {
Connection cn = sc.OpenDatabase();
PreparedStatement ps2 = cn.prepareStatement("INSERT INTO elenxos (event_id,ticket_id) VALUES (?,?)");
ps2.setInt(1,this.event_id);
ps2.setInt(2,this.ticket_id);
ps2.executeUpdate();
JOptionPane.showMessageDialog(null,"Valid Ticket");
} catch (SQLException case1) {
case1.printStackTrace();
} catch (Exception case2){
case2.printStackTrace();}
}
else if (allowed == false)
errMsg2 += "Impossible to use the same ticket 2 times!!";
}catch (SQLException e)
{
System.out.println("8");
}
catch (Exception e)
{
System.out.println("9");
}
} else {
errMsg2 += "FAILURE!!" ;
}
return errMsg2;
}
似乎您在努力執行查詢,每次執行查詢時查詢值都會不同。 您應該使用PreparedStatement
處理這種情況。 一旦創建,這將允許您使用相同的語句,並為其提供不同的值。 另外,如果您只是嘗試查看是否發生重復,則可以改善數據庫查詢。
考慮以下:
package com.example.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Check {
// Class fields
private PreparedStatement check;
private String checkQuery = "Select Count(*)"
+ " from events inner join tickets on tickets.id = events.id"
+ " where tickets.id = ? " + " and events.id = ? ";
// Object fields
private int ticket_id;
private int event_id;
public Check(int ticket_id, int event_id) {
super();
this.ticket_id = ticket_id;
this.event_id = event_id;
}
public int getTicket_id() {
return ticket_id;
}
public void setTicket_id(int ticket_id) {
this.ticket_id = ticket_id;
}
public int getEvent_id() {
return event_id;
}
public void setEvent_id(int event_id) {
this.event_id = event_id;
}
public boolean checkExistance_3(Connection sc) {
boolean returnValue = false;
// TODO previously established db connnection passed performance reasons
try {
check = sc.prepareStatement(checkQuery);
// the first argument is the varialbe indes, the second the value to
// supstitute
check.setInt(1, ticket_id);
check.setInt(2, event_id);
ResultSet results = check.executeQuery();
results.next();
int countResult = results.getInt("RowCount");
if (countResult > 1) {
returnValue = true;
}
} catch (SQLException e) {
System.out.println("Error querying database: " + e.getMessage());
}
return returnValue;
}
}
然后,我要檢查並確保它們不匹配超過1次,並返回一個布爾值。
您不需要對Java中的重復項進行任何檢查,這些東西應始終在數據庫端處理。
另外,您根本不需要第三張桌子,因為通常票證只允許您進入某個事件。 因此,您應該具有1:n的關系。
您應該只能夠將event_id用作票證表中的外鍵列,並將主鍵定義為ticket_id和event_id的組合。 這將解決您的所有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.