Как выполнить второй запрос, если первый запрос пуст в mysql и php?

#php #html #mysql #forms

#php #HTML #mysql #формы

Вопрос:

У меня есть html-форма, которая передает значения в php-файл, который выполняет запрос и отображает результаты.
Теперь я хочу, чтобы, если в этом первом запросе результат был пустым (0 строк), выполнялся точно такой же запрос, но над другой таблицей и отображал результаты.

Вот код, который выполняет первый запрос:

 <?php 

echo "<table style='border: solid 1px black;'>";
echo "<tr>
<th>R1</th>
<th>R2</th>
<th>R3</th>
<th>R4</th>
<th>R5</th>
</tr>";


class TableRows1 extends RecursiveIteratorIterator {
function __construct($it1) {
    parent::__construct($it1, self::LEAVES_ONLY);
}

function current() {
    return "<td style='width: 70px;'>" . parent::current(). "</td>";
}

function beginChildren() {
    echo "<tr>";
}

function endChildren() {
    echo "</tr>" . "n";
}
}

if( isset($_POST['submit']) )
{
    $feature = $_POST['R1'];
    $feature2 = $_POST['R2'];
    $feature3 = $_POST['R3'];
    $feature4 = $_POST['R4'];
    $feature5 = $_POST['R5'];
};

$feature = $_POST['R1'];
$feature2 = $_POST['R2'];
$feature3 = $_POST['R3'];
$feature4 = $_POST['R4'];
$feature5 = $_POST['R5'];

$values = [$feature, $feature2, $feature3, $feature4, $feature5];


$servername = "";
$username = "";
$password = "";
$dbname = "";

try {


$conn1 = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt1 = $conn1->prepare(

"SELECT
R1, 
R2, 
R3, 
R4, 
R5, 
FROM table
WHERE
R1 = ?
AND
R2 = ?
AND
R3 = ?
AND
R4 = ?
AND
R5 = ?");

$stmt1->bindParam(1, $feature, PDO::PARAM_INT);
$stmt1->bindParam(2, $feature2, PDO::PARAM_INT);
$stmt1->bindParam(3, $feature3, PDO::PARAM_INT);
$stmt1->bindParam(4, $feature4, PDO::PARAM_INT);
$stmt1->bindParam(5, $feature5, PDO::PARAM_INT);

$stmt1->execute();


// set the resulting array to associative
$result1 = $stmt1->setFetchMode(PDO::FETCH_ASSOC);

foreach(new TableRows1(new RecursiveArrayIterator($stmt1->fetchAll())) as $k1=>$v1) {
    echo $v1;
}
}
catch(PDOException $e1) {
echo "Error: " . $e1->getMessage();
}
$conn1 = null;
echo "</table>";
?>
  

Я, честно говоря, не знаю, где и как разместить второй запрос, любые идеи и рекомендации, которые я буду очень признателен!

Комментарии:

1. Почему бы не выполнить только один запрос по обеим таблицам, но показывать результаты только по второй таблице, если первая пуста?

2. @Strawberry для выполнения запроса к нескольким таблицам, насколько я знаю, у них должны быть общие строки, в этом случае две таблицы не имеют общих строк

3. Это не совсем так.

Ответ №1:

В качестве примера; Я не говорю, что это красиво, но я надеюсь, что это скорее недостаток модели данных, чем мои навыки программирования…

 DROP TABLE IF EXISTS table_a;
DROP TABLE IF EXISTS table_b;

CREATE TABLE table_a(id SERIAL PRIMARY KEY);
CREATE TABLE table_b(id SERIAL PRIMARY KEY);

INSERT INTO table_b VALUES (NULL),(NULL),(NULL);

SELECT x.* 
  FROM
     ( SELECT 1 source, id FROM table_a
        UNION
       SELECT 2, id FROM table_b
     ) x
  JOIN
     ( SELECT MIN(source) min_source
         FROM 
            ( SELECT 1 source, id FROM table_a
               UNION
              SELECT 2, id FROM table_b
            ) n
     ) y
    ON y.min_source = x.source;
    
 -------- ---- 
| source | id |
 -------- ---- 
|      2 |  1 |
|      2 |  2 |
|      2 |  3 |
 -------- ---- 
  

Ответ №2:

Основываясь на совете @Strawberry, мне удалось решить его с помощью следующего запроса:

 SELECT 
NULL AS field1,
table1.R1,
table1.R2,
table1.R3,
table1.R4,
table1.R5,
FROM 
table1
WHERE
table1.R1 = ?
AND
table1.R2 = ?
AND
table1.R3 = ?
AND
table1.R4 = ?
AND
table1.R5 = ? 
UNION ALL
SELECT
table2.field1, 
table2.R1,
table2.R2,
table2.R3,
table2.R4,
table2.R5
FROM table2
WHERE 
table2.R1 = ?
AND
table2.R2 = ?
AND
table2.R3 = ?
AND
table2.R4 = ?
AND
table2.R5 = ?;