MYSQL Query Cross Database Join return NULL - mysql

select t1.CardID,t2.Description,t5.BioData
from db2.tblemployeeinfob t1
left join (db2.tbldepartments t2,db1.tblbiometrics t5)
on
(t1.Department = t2.DepartmentID and
t1.CardID=t5.CardID
)
Return Result is 1420 | (NULL) | (NULL)
Expected Result is 1420 | DB2_Description_Value | DB1_BioData_value
if i remove cross database join, like remove db1 then query will work fine to join remaining two tables from same database.
if i do cross database join between db1 and db2, even table t2 from same database db2 is returning NULL.
Where is problem with my Query, so i can get value from both databases.

You shouldn't be using a cross join here. You want two separate left joins:
SELECT t1.CardID, t2.Description, t5.BioData
FROM db2.tblemployeeinfob AS t1
LEFT JOIN db2.tbldepartments AS t2 ON t1.Department = t2.DepartmentID
LEFT JOIN db1.tblbiometrics AS t5 ON t1.CardID = t5.CardID

<?php
include('../dbcon.php');
include('../session.php');
if (isset($_POST['delete_user'])){
$id=$_POST['selector'];
$class_id = $_POST['teacher_class_id'];
$get_id=$_POST['get_id'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysql_query("select * from files where file_id = '$id[$i]' ")or die(mysql_error());
while($row = mysql_fetch_array($result)){
$fname = $row['fname'];
$floc = $row['floc'];
$fdesc = $row['fdesc'];
$uploaded_by = $row['uploaded_by'];
mysql_query("insert into files (floc,fdatein,fdesc,class_id,fname,uploaded_by) value('$floc',NOW(),'$fdesc','$class_id','$fname','$uploaded_by')")or die(mysql_error());
}
}
?>
<script>
window.location = 'downloadable.php<?php echo '?id='.$get_id; ?>';
</script>
<?php
}
if (isset($_POST['copy'])){
$id=$_POST['selector'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysql_query("select * from files where file_id = '$id[$i]' ")or die(mysql_error());
while($row = mysql_fetch_array($result)){
$fname = $row['fname'];
$floc = $row['floc'];
$fdesc = $row['fdesc'];
mysql_query("insert into teacher_backpack (floc,fdatein,fdesc,teacher_id,fname) value('$floc',NOW(),'$fdesc','$session_id','$fname')")or die(mysql_error());
}
}
?>
<script>
window.location = 'backpack.php';
</script>
<?php
}
?>
<?php
if (isset($_POST['share'])){
$id=$_POST['selector'];
$teacher_id = $_POST['teacher_id1'];
echo $teacher_id ;
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysql_query("select * from files where file_id = '$id[$i]' ")or die(mysql_error());
while($row = mysql_fetch_array($result)){
$fname = $row['fname'];
$floc = $row['floc'];
$fdesc = $row['fdesc'];
mysql_query("insert into teacher_shared (floc,fdatein,fdesc,teacher_id,fname,shared_teacher_id) value('$floc',NOW(),'$fdesc','$session_id','$fname','$teacher_id')")or die(mysql_error());
}
}
?>
<script>
window.location = 'tambah_share_file.php';
</script>
<?php
}
?>

Related

MySQL fetch_assoc() shows 1 less result

i have a table like below:
hub dep
A B
A C
B D
B E
B F
E G
i use mysql select to get query and my code is like below:
$sql = "SELECT dep FROM handd WHERE hub='B'";
$result = $conn->query( $sql );
$row = $result->fetch_assoc();
while($row = $result->fetch_assoc()) {
echo "id: " . $row["dep"]."<br>";
}
but it just gives me result like below:
id: E
id: F
and i am wondering where is D?
$row = $result->fetch_assoc();
This line stores the result of 'B D'. It actually should be:
$sql = "SELECT dep FROM handd WHERE hub='B'";
$result = $conn->query( $sql );
while($row = $result->fetch_assoc()) {
echo "id: " . $row["dep"]."<br>";
}

PHP - How to group from multiple sql queries

I got
for($i = $start_date;$start_date <= $end_date;$i->modify('+1 day')) {
$i->format('Y-m-d').'<br />';
$dates = $i->format('Y-m-d');
echo $query = "
SELECT md.dish_id
, md.daydate
, d.id
, d.dish_name
, d.weight
, d.price
FROM dishes d
LEFT
JOIN menu_details md
ON d.id = md.dish_id
WHERE md.daydate = '$dates'
";
$result = mysql_query($query);
}
while($row = mysql_fetch_array($result)) {
echo 'Date: '.$row['daydate'].'Name: '.$row['dish_name'].'<br />';
}
how can i row 'dish_name' for every date on a new row.In the database there are more then 1 row with same date=
You should try to avoid running queries in loops...
Try:
$query = "SELECT md.dish_id, md.daydate, d.id, d.dish_name, d.weight, d.price
FROM dishes d
LEFT JOIN menu_details md ON (d.id = md.dish_id)
WHERE md.daydate BETWEEN '$start_date' AND '$end_date'
GROUP BY md.daydate ";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
echo 'Date: '.$row['daydate'].'Name: '.$row['dish_name'].'<br />';
}
What is the group by for? I think it may cause you to lose some of the results...

Select data from the same column

I need to select data from the same column with different values?
How do I
select * FROM billingorganization WHERE user_id = $user_id && user_id = 0?
<select name="billing_name">
<?php
$query2 = "SELECT * from billingorganization WHERE user_id = $user_id";
$result2 = mysqli_query($link, $query2) or die(mysqli_error($link));
while ($row3 = mysqli_fetch_array($result2)) {
$billing_name = $row3['billing_name'];
$billing_name_id = $row3['billing_name_id'];
?>
<option value="<?php echo $billing_name; ?>" ><?php echo $billing_name ;?></option>
<?php
}
?>
</select>
select * FROM billingorganization WHERE user_id = $user_id OR user_id = 0
You can use the format
SELECT ... FROM ... WHERE user_id IN ($userid,0)
It's clear, simple and elegant.

Add many-to-many select into existing query

I have a query set up to return comments given from one user to another.
Now we want to allow the ability to rate these comments.
I've added a new table that has 3 fields: comment_id, user_id, and score.
How can I grab an array of {user_id,score} for any comment fetched?
Will I need to loop through the comments after they are fetched and run a second query? This approach could result in adding several extra queries.
Can it be done with a single query?
Here's the function I have now:
function getAllComments($args) {
if(empty($_SESSION['user']['id'])) return false;
$limit = 5;
if(isset($args['limit'])) $limit = $args['limit'];
$page = 1;
if(isset($args['page'])) $page = $args['page'];
$data = array();
$offset = ($page-1)*$limit;
$sql = "SELECT c.*,CONCAT(u1.firstName,' ',u1.lastName) AS owner,u1.title AS ownerTitle,CONCAT_WS(' ',u2.firstName,u2.lastName) AS senderName,u2.title AS senderTitle,a.name AS actionName,a.behavior
FROM comment AS c
JOIN user AS u1 ON c.recipient = u1.id
JOIN user AS u2 ON c.sender = u2.id
JOIN action AS a ON c.action = a.id
WHERE c.type=1";
if(isset($args['location'])) $sql .= " AND u1.location=?";
$sql .= " ORDER BY date DESC";
$sql .= " LIMIT ?";
$sql .= " OFFSET ?";
try {
$db = DB::getInstance();
$stmt = $db->dbh->prepare($sql);
$n = 1;
//THESE MUST STAY IN THE SAME ORDER TO MATCH THE ? PLACEHOLDERS
if(isset($args['location'])) $stmt->bindValue(($n++), $args['location'], PDO::PARAM_INT);
$stmt->bindValue(($n++), $limit, PDO::PARAM_INT);
$stmt->bindValue(($n++), $offset, PDO::PARAM_INT);
$result = $stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$rows = array();
if($result !== false) {
while($row = $stmt->fetch()) {
$rows[] = $row;
}
$data['comments'] = $rows;
return $data;
}else {
logit('Query Failed');
return false;
}
}catch(PDOException $e) {
logit($e->getMessage());
return false;
}
}
If you for example wanted all {comment_id, user_id, score} associated with the comments of user 5, your query would involve an INNER JOIN and look something like:
SELECT s.comment_id, s.user_id, s.score FROM CommentScore s
INNER JOIN Comment c
ON c.comment_id = s.comment_id
WHERE c.user_id = 5

making SQL more efficiency by making two queries into one instead of having a loop

I have the following code and was wondering how I could simplify it into one MYSQL statement
$sql = "SELECT sesionID
FROM `juegos_sesiones`
WHERE `usuarioID` = ".$_SESSION['MM_UserID'];
$query = mysql_query($sql, $cnx) or die(mysql_error());
//$row_rsPaises = mysql_fetch_assoc($rsPaises);
$exercises = mysql_num_rows($query);
echo $exercises;
//find total points
while( $row = mysql_fetch_array($query)){
$sql2 = 'SELECT correct_answers FROM `juegos_sesiones_detalle` WHERE `sesionID` = '.$row['sesionID'];
$query2 = mysql_query($sql2, $cnx) or die(mysql_error());
$details2 = mysql_fetch_assoc($query2);
$counter = $counter + $details2['correct_answers'];
}
echo '<br />'.$counter;
SELECT sum(correct_answers) as total_correct_answers
FROM `juegos_sesiones_detalle` d
INNER JOIN `juegos_sesiones` s on s.`sesionID` = d.`sesionID`
WHERE `usuarioID` = $_SESSION['MM_UserID']
You can read about joins here
You can write single query by using INNER JOIN as:
SELECT correct_answers
FROM juegos_sesiones_detalle a
INNER JOIN juegos_sesiones b
ON a.sesionID = b.usuarioID;
Try this :
$sql = "SELECT correct_answers FROM `juegos_sesiones_detalle` jsd
JOIN `juegos_sesiones` js
ON jsd.sesionID = js.`sesionID`
WHERE js.usuarioID = ".$_SESSION['MM_UserID'];