[PHP] selezionare colonne in comune con un altra tabella

samurai.sette

Utente Attivo
17 Dic 2015
234
6
18
Ciao a tutti. Avrei bisogno di un vostro aiutino.
Nel mio database ho due tabelle così composte.
Tab 1
id | nomi_colonne | visibilità

1 | valore1 | SI
2 | valore2 | NO
3 | valore3 | NO
4 | valore4 | SI

Tab 2
id | valore1 | valore2 | valore3 | valore4

Quello che dovrei fare è questo: dalla tabella2 devo selezionare soltanto le colonne che hanno "visibilità" uguale a SI nella tabella1. Nel caso in esame, selezionare soltanto le colonne "valore1" e "valore4".
Secondo voi come potrei fare?
Ciao, grazie mille a tutti.
 

Eduadie

Utente Attivo
22 Mar 2013
58
7
8
www.mrrobotbet.altervista.org
Una prima soluzione che mi viene in mente è di lanciare una query per controllare quale dei valori ha SI e costruire una seconda query selezionando solo le colonne della tab2 con valore attraverso una semplice concatenazione di stringhe.

$sql1 = "SELECT visibilità FROM tab1"
$testo = "";
creo l'array dei risultati e lo itero.
per ogni visibilità uguale a SI
$testo .= valore1, ;
alla fine creo la query finale
$sql2 = "SELECT " . $testo . "FROM tab2"

Spero di essere stato chiaro.
 

marino51

Utente Attivo
28 Feb 2013
3.160
202
63
Lombardia
queste sono le tabelle come le hai descritte, con i relativi valori

Codice:
DECLARE @tab1 TABLE
(
id           int,
nomi_colonne varchar(10),
visibilita   varchar(2)
);

DECLARE @tab2 TABLE
(
id           int,
valore1      varchar(10),
valore2      varchar(10),
valore3      varchar(10),
valore4      varchar(10)
);

INSERT INTO @tab1 ( id, nomi_colonne, visibilita ) VALUES (11, 'valore1', 'SI');
INSERT INTO @tab1 ( id, nomi_colonne, visibilita ) VALUES (12, 'valore2', 'NO');
INSERT INTO @tab1 ( id, nomi_colonne, visibilita ) VALUES (13, 'valore3', 'NO');
INSERT INTO @tab1 ( id, nomi_colonne, visibilita ) VALUES (14, 'valore4', 'SI');

INSERT INTO @tab2 ( id, valore1, valore2, valore3, valore4 ) VALUES (1, 'colonna1', 'colonna2', 'colonna3', 'colonna4');

questa è la query, scritta in modo da semplificare la select, vedi se riesci ad implementarla (tutti i comandi costituiscono un'unica query)

Codice:
DECLARE @col1 AS NVARCHAR(2),
        @col2 AS NVARCHAR(2),
        @col3 AS NVARCHAR(2),
        @col4 AS NVARCHAR(2);

set @col1 = ( SELECT visibilita FROM @tab1 WHERE nomi_colonne = 'valore1' );
set @col2 = ( SELECT visibilita FROM @tab1 WHERE nomi_colonne = 'valore2' );
set @col3 = ( SELECT visibilita FROM @tab1 WHERE nomi_colonne = 'valore3' );
set @col4 = ( SELECT visibilita FROM @tab1 WHERE nomi_colonne = 'valore4' );

SELECT
    ( CASE WHEN @col1 = 'SI' THEN valore1 ELSE null END ) valore1,
    ( CASE WHEN @col2 = 'SI' THEN valore2 ELSE null END ) valore2,
    ( CASE WHEN @col3 = 'SI' THEN valore3 ELSE null END ) valore3,
    ( CASE WHEN @col4 = 'SI' THEN valore4 ELSE null END ) valore4
FROM @tab2;

questo è il risultato

upload_2018-4-4_20-51-18.png
 

samurai.sette

Utente Attivo
17 Dic 2015
234
6
18
Ciao a tutti e grazie per l'aiuto.
Ho provato a fare in questo modo ma ciò non mi convince del tutto.
PHP:
<?php
    if (isset ($_POST['bottone']))
    {
        $con = mysqli_connect ("localhost","root","","database");
        $array_colonne = array();
        $db = mysqli_query ($con, "SELECT nomi_colonne FROM tabella_ok");
        while ($row = mysqli_fetch_array($db))
        {
            $array_colonne[] = $row['nomi_colonne'];
        }
      
        $num_colonne = count($array_colonne);
        $i = 0;
      
        for ($i = 0; $i <= ($num_colonne - 1); $i++)
        {
            $nomi_col = $array_colonne[$i];
            $db1 = mysqli_query ($con, "SELECT $nomi_col FROM tabella1 ORDER BY id");
            while ($row1 = mysqli_fetch_array($db1))
            {
                echo $row1[0] . "<br />";
            }     
        }     
    }
?>
Quello che non mi convince è il ciclo for. Facendo in questo modo l'estrazione dei dati dalla tabella è più lenta.
Secondo voi come potrei migliorare la cosa?
Ciao, grazie mille a tutti.
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Verticalizzando il DB l'accesso seppur all'aumentare dei dati diventa sensibilmente più lento, hai la possibilità di non rimanere bloccato con una struttura impostata (bloccata) e soprattutto non devi mettere mani alla query.
Parametrizzando bene i problemi sopra citati (seppur argomentati con valide soluzioni) bloccano la struttura dati rendendo l'ampliamento (aggiunta di un valore) di difficile gestione.
Credo che il Modello Wordpress sia da prendere in considerazione per la memorizzazione dei dati, ossia

id|ref_ |meta_key|meta_value|status
1 |1 | valore_1 | valore memorizzato| 1
2 |1 | valore_2 | valore memorizzato |0
etc....
In questo modo aggiungendo e/o eliminando chiavi "meta_key" non dovrai rimettere mani al codice.

Banalmente sia se aggiungi o elimini chiavi, la query sarà sempre questa:
Codice:
SELECT * FROM TBL WHERE status = 1
 

marino51

Utente Attivo
28 Feb 2013
3.160
202
63
Lombardia
Ho provato a fare in questo modo ma ciò non mi convince del tutto
mi sembra che il risultato sia l' elenco dei valori senza considerare se visibili o no,
e senza considerare che si perde il legame con id della riga

upload_2018-4-5_22-38-13.png

avevo capito che ti servisse una soluzione che potesse estrarre le righe selezionate, senza visualizzare le colonne "NO"

upload_2018-4-5_22-42-16.png

Visto che preferisci la soluzione con php, la trovi di seguito, a te rimettere "msqli"
PHP:
$select_colonne = "";
$sth = $db->query("SELECT nomi_colonne, visibilita FROM tabella_ok");
while( $row = $sth->fetch() )
{
    if ( !empty($select_colonne) ) $select_colonne .= ", ";
    $select_colonne .= ( $row['visibilita'] == "NO" ?  "null as " : "" ) . $row['nomi_colonne'];
}

$sth = $db->query("SELECT id, " . $select_colonne . " FROM tabella1 ORDER BY id");
while ( $row = $sth->fetch() )
{
    echo json_encode($row, JSON_PRETTY_PRINT)."<br />";
}

è chiaro che guida la "tabella_ok", per creare la query di selezione dei valori,
una soluzione che offre diverse opportunità
per esempio avere gruppi di colonne ..... per creare dinamicamente query di selezione diverse
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
S [PHP] Selezionare i campi non in comune con le altre colonne della tabella PHP 4
S [PHP] Selezionare tutte le colonne meno due PHP 6
M [PHP] Selezionare immagini directory non presenti in db PHP 11
S [PHP] selezionare colonna tabella utilizzando un array PHP 1
L [PHP] CHECKBOX DA SELEZIONARE IN UNA TABELLA PHP 4
G [PHP] Selezionare OGGI anno precedente per query sql PHP 2
A [RISOLTO] PHP Selezionare tutti i file con stessa estensione PHP 2
S [PHP] Selezionare dati in intervallo di tempo PHP 21
gandalf1959 Selezionare un intervallo tra due date, php e mysql PHP 2
M [PHP] selezionare dati da db e fare confronti PHP 0
L [PHP] selezionare righe di una tabella con le checkbox e cancellarle PHP 2
S [PHP] Selezionare ultimo campo ed escludere doppioni PHP 16
L [php e mysql] selezionare sia i selezionati e i non selezionati PHP 1
M Tabella PHP con sorgente dati csv: selezionare le riche e compilare Form eMail PHP 1
C Wp-admin a file php WordPress 3
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7

Discussioni simili