Suppose I have a table like this:
Table swipes
swp_id swp_by swp_to swp_type swp_date
1 8 1 top 2020-03-24 02:39:12
2 11 1 right 2020-03-18 02:37:58
3 1 8 right 2020-03-31 04:04:40
4 1 11 top 2020-03-31 04:04:40
Based on which I have my setup like this:
<?php
$stmt = $pdo->prepare("SELECT * FROM swipes WHERE swp_by = :mem AND swp_type != 'left' ORDER BY swp_id DESC");
$stmt-> bindValue(':mem', $sessionUser);
$stmt-> execute();
while($swp = $stmt->fetch()){
$match = $pdo->prepare("SELECT swp_id, swp_date FROM swipes WHERE swp_by = :by AND swp_to = :to AND swp_type != 'left'");
$match-> bindValue(':by', $swp['swp_by']);
$match-> bindValue(':to', $sessionUser);
$match-> execute();
while($mat = $match->fetch()){
?>
<!-- Some HTML Part here to display fetched data as per second while loop -->
<?php } } ?>
As you can see right now I have ORDER BY swp_id DESC
in first query which works fine. But when I try removing from 1st query and adding it in second query it doesn’t work. What I actually want to do is to get the time from the latest swipe.
As you can see in table given above for the 1st two rows with swp_id
1 & 2, Users 8 and 11 swiped user 1 first. Later, user 1 swiped users 8 & 11 as you can see in records with swp_id
3 & 4. Now, record 3 & 4 are the latest records. Hence, I want to fetch the swp_date
from these records and not from 1 & 2. Right now, it’s returning date from records 1 and 2.
Advertisement
Answer
Suppose you want all the user_id’s and dates from users that swiped to user_id 1, but only if he(she) swiped that user too, and not to the left.
So extending your table a bit:
swp_by swp_to swp_type swp_date
8 1 top
8 4 top <not
11 1 top
1 8 top
1 11 top
20 1 top < not
1 40 top < not
1 41 left < not
First part: select all the swipes from user 1 swp_by = 1
that are not left (the same as your first query):
// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date
FROM swipes
WHERE swp_by = :mem AND swp_type <> "left"
Result 1:
swp_by swp_to swp_type swp_date
1 8 top
1 11 top
1 40 top <not
Second part: find all the swipes “back” to user 1, so where swp_to = 1
// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date
FROM swipes
WHERE swp_to = :mem AND swp_type <> "left"
Result 2:
swp_by swp_to swp_type swp_date
8 1 top
11 1 top
20 1 top < not
Now you can cross reference the results finding the swp_to
numbers from Result 1 (8, 11, 40) that have a swp_by
in Result 2 (8, 11, 20). This can be done using a LEFT JOIN
from the same table
//this, in combination with WHERE, gives Result 1
SELECT R1.swp_id, R1.swp_to, R1.swp_type , GREATEST(R1.swp_date,R2.swp_date)
FROM swipes AS R1
//cross reference with Result 2
LEFT JOIN swipes AS R2
ON (
//look for those records where R1.swipe_to = R2.swipe_by
R1.swp_to = R2.swp_by
AND
//swipe_to from Result 2 has to be user 1
R2.swp_to = R1.swp_by
AND
//no left swipes in Result 2
R2.swp_type <> "left"
)
WHERE
//look only at the records from user 1...
R1.swp_by = :mem
AND
//...that are not empty
R2.swp_by IS NOT NULL
AND
//... that not are left
R1.swp_type <> 'left'
ORDER BY R1.swp_id DESC
Here’s a new fiddle
*EDIT OP wanted latest date, adjusted with GREATEST
for date