Busque esta misma pregunta & respuestas aquí y en otros sitios indagando en la web, encontrando siempre comentarios negativos sobre hacer una consulta dentro del bucle while
.
Algunos comentarios
Para obtener resultados adicionales debo hacer consultas dentro de un bucle while
si o si, no tengo otra opción en mi poca base de conocimientos, esta es mi contradicción hacia mí.
Mi pregunta:
¿Cómo puedo obtener datos adicionales sin que exista problemas de rendimiento de la aplicación?
Nota: La consulta y el resultado lo realice como un procedimiento de prueba los resultados se muestran sin error alguno, lo que sí preocupa son los comentarios negativos de realizar consultas dentro de un
bucle while
todas las consultas se basan a contenido relacional, pero si no fuera así, si no fueran datos relacionales.
$stmt = $con->prepare("SELECT id_producto,producto FROM producto WHERE activo=? order by id_producto ASC limit 5");
$stmt->bind_param("i",$activo);
$activo = "1";
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows>0) {
$stmt->bind_result($id_producto, $producto);
while ($stmt->fetch()) {
echo "<h1>$producto</h1>";
//Comporbar cuantas personas compraron este producto
$stmtOrden = $con->prepare("SELECT * FROM orden WHERE id_producto=? AND estadodelpedido=?");
$stmtOrden->bind_param("is",$id_producto,$estadodelpedido);
$estadodelpedido = "pagado";
$stmtOrden->execute();
$stmtOrden->store_result();
$comprasdeesteproducto = $stmtOrden->num_rows;
$stmtOrden->close();
echo "este producto se compro $comprasdeesteproducto veces";
//Comprobar dato del anunciante del producto
$stmtads = $con->prepare("SELECT * FROM ads WHERE id_producto=?");
$stmtads->execute();
$stmtads->store_result();
if ($stmtads->num_rows>0) {
$stmtads->bind_result();
while ($stmtads->fetch()) {}
} else {}
//Para evitar un extenso código solo añado las consultas como ejemplo
//Comprobar la eficiencia del vendedor al entregar el producto al cliente
$stmtVendedorCliente = $con->prepare("SELECT * FROM vendedor WHERE id_producto=?");
$stmtVendedorCliente->execute();
$stmtVendedorCliente->store_result();
if ($stmtVendedorCliente->num_rows>0) {
$stmtVendedorCliente->bind_result();
while ($stmtVendedorCliente->fetch()) {}
} else {}
//Comprobar el país del producto
$stmtPais = $con->prepare("SELECT * FROM pais WHERE id_producto=?");
$stmtPais->execute();
$stmtPais->store_result();
if ($stmtPais->num_rows>0) {
$stmtPais->bind_result();
while ($stmtPais->fetch()) {}
} else {}
}
} else {
echo "No existen registros";
}
Estructura de las tablas:
-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 24-10-2017 a las 03:50:04
-- Versión del servidor: 10.1.19-MariaDB
-- Versión de PHP: 5.6.28
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Base de datos: `shopping`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `ads`
--
CREATE TABLE `ads` (
`id_ads` int(11) NOT NULL,
`id_producto` int(11) NOT NULL,
`ads` varchar(100) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
--
-- Volcado de datos para la tabla `ads`
--
INSERT INTO `ads` (`id_ads`, `id_producto`, `ads`) VALUES
(1, 1, 'J.Doe'),
(2, 2, 'Dani'),
(3, 3, 'mel');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `orden`
--
CREATE TABLE `orden` (
`id_orden` int(11) NOT NULL,
`id_producto` int(11) NOT NULL,
`estadodelpedido` varchar(50) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
--
-- Volcado de datos para la tabla `orden`
--
INSERT INTO `orden` (`id_orden`, `id_producto`, `estadodelpedido`) VALUES
(2, 1, 'pagado'),
(3, 1, 'pagado'),
(4, 1, 'pagado'),
(5, 2, 'pagado'),
(6, 2, 'pagado'),
(7, 3, 'pagado');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `pais`
--
CREATE TABLE `pais` (
`id_pais` int(11) NOT NULL,
`id_producto` int(11) NOT NULL,
`pais` varchar(100) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
--
-- Volcado de datos para la tabla `pais`
--
INSERT INTO `pais` (`id_pais`, `id_producto`, `pais`) VALUES
(2, 1, 'Mexico'),
(3, 2, 'España'),
(5, 3, 'sweden');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `producto`
--
CREATE TABLE `producto` (
`id_producto` int(11) NOT NULL,
`producto` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
`activo` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
--
-- Volcado de datos para la tabla `producto`
--
INSERT INTO `producto` (`id_producto`, `producto`, `activo`) VALUES
(1, 'Nike', 1),
(2, 'Adidad', 1),
(3, 'gel', 1);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `vendedor`
--
CREATE TABLE `vendedor` (
`id_vendedor` int(11) NOT NULL,
`id_producto` int(11) NOT NULL,
`calidad_de_entrega` int(11) NOT NULL,
`id_usuario` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
--
-- Volcado de datos para la tabla `vendedor`
--
INSERT INTO `vendedor` (`id_vendedor`, `id_producto`, `calidad_de_entrega`, `id_usuario`) VALUES
(1, 1, 4, 1),
(2, 2, 5, 2),
(3, 3, 3, 6);
--
-- Índices para tablas volcadas
--
--
-- Indices de la tabla `ads`
--
ALTER TABLE `ads`
ADD PRIMARY KEY (`id_ads`);
--
-- Indices de la tabla `orden`
--
ALTER TABLE `orden`
ADD PRIMARY KEY (`id_orden`);
--
-- Indices de la tabla `pais`
--
ALTER TABLE `pais`
ADD PRIMARY KEY (`id_pais`);
--
-- Indices de la tabla `producto`
--
ALTER TABLE `producto`
ADD PRIMARY KEY (`id_producto`);
--
-- Indices de la tabla `vendedor`
--
ALTER TABLE `vendedor`
ADD PRIMARY KEY (`id_vendedor`);
--
-- AUTO_INCREMENT de las tablas volcadas
--
--
-- AUTO_INCREMENT de la tabla `ads`
--
ALTER TABLE `ads`
MODIFY `id_ads` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
--
-- AUTO_INCREMENT de la tabla `orden`
--
ALTER TABLE `orden`
MODIFY `id_orden` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
--
-- AUTO_INCREMENT de la tabla `pais`
--
ALTER TABLE `pais`
MODIFY `id_pais` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT de la tabla `producto`
--
ALTER TABLE `producto`
MODIFY `id_producto` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
--
-- AUTO_INCREMENT de la tabla `vendedor`
--
ALTER TABLE `vendedor`
MODIFY `id_vendedor` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
El resultado que obtengo: