Wyszukiwanie danych w bazie na podstawień wyniku wcześniejszej kwerendy

0

zapytanie nr1:

$sqlm = " SELECT element from kd_zamowienia_uzupelnienie where wykonano is null"; 
$usersQuerym = $mdb->query($sqlm);
$usersm = $usersQuerym->fetchAll(); 

zapytanie nr2:

$sql = "SELECT
    mws_stany.artykul_id,
    artykul.nazwa1,
    mws_stany.paczka_id,
    zamowienia_spec.artykul_kod,
    mws_stany.etykieta,
    mws_stany.xyz,
    mws_stany.paczka
    from mws_stany
    inner join artykul on artykul.artykul_id = mws_stany.artykul_id
    inner join zamowienia_spec on zamowienia_spec.zamowienia_spec_id = mws_stany.zamowienia_spec_id
    where mws_stany.ilosc = 1 and mws_stany.magazyny_id in (33) 
    and mws_stany.paczka_id = :IP
    ORDER BY artykul.nazwa1 ";

$stmt = $pdo -> prepare($sql);
$stmt -> bindValue(':IP', $usersm, PDO::PARAM_STR);
$users = $stmt -> execute();

Zapytania nie sa w jednej bazie. Jedną jest z mysql drugie z firebird. Pragnę użyć wyniku pierwszego zapytani do wyszukania danych z drugiego. Prubowałem tak i sie nie udało.

0

"i sie nie udało" - a jakieś więcej informacji? Otrzymałeś jakąś informację o błędzie, czy po prostu wyniki są puste?

$usersm = $usersQuerym->fetchAll(); 
...
$stmt -> bindValue(':IP', $usersm, PDO::PARAM_STR);

Z tego, co widzę w dokumentacji, PdoStatement::fetchAll() zawsze zwraca tablicę. Być może błąd tkwi w tym, że przekazujesz tę tablicę do bindValue() i każesz ją traktować jako string?

0

Wyrzuca błąd takie treści:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)

0

Rozwiązałem problem chałupniczą metodą:

$sqlm = " SELECT element from kd_zamowienia_uzupelnienie where wykonano is null";
    
    $usersQuerym = $mdb->query($sqlm);

    $usersm = $usersQuerym->fetchAll();   

    $sql = "SELECT
    mws_stany.artykul_id,
    artykul.nazwa1,
    mws_stany.paczka_id,
    zamowienia_spec.artykul_kod,
    mws_stany.etykieta,
    mws_stany.xyz,
    mws_stany.paczka
    from mws_stany
    inner join artykul on artykul.artykul_id = mws_stany.artykul_id
    inner join zamowienia_spec on zamowienia_spec.zamowienia_spec_id = mws_stany.zamowienia_spec_id
    where mws_stany.ilosc = 1 and mws_stany.magazyny_id in (33) 
    and mws_stany.paczka_id in ( ";
    
foreach ($usersm as $user) {
  $sql = $sql ."'".  $user['element'] ."',";
}
$sql = substr($sql,0,strlen($sql)-1);
$sql = $sql .") ORDER BY artykul.nazwa1 ";
$usersQ = $db->query($sql);
$users = $usersQ->fetchAll();

Nie wiem tylko czy przy dużej tablicy nie bedzie problemu.

0

@Elm: Masakrę jakąś robisz ze sklejaniem zapytań :-)

Silniki przeważanie mają ograniczenia na ilość elementów w klauzuli IN .

Można zrobić prostego joina do podzapytania..

SELECT
    mws_stany.artykul_id,
    artykul.nazwa1,
    mws_stany.paczka_id,
    zamowienia_spec.artykul_kod,
    mws_stany.etykieta,
    mws_stany.xyz,
    mws_stany.paczka
    from mws_stany
    inner join artykul on artykul.artykul_id = mws_stany.artykul_id
    inner join zamowienia_spec on zamowienia_spec.zamowienia_spec_id = mws_stany.zamowienia_spec_id
    inner join (SELECT element from kd_zamowienia_uzupelnienie where wykonano is null) elementy on elementy.element = mws_stany.paczka_id 
    where mws_stany.ilosc = 1 and mws_stany.magazyny_id in (33) 

Jako, że robisz inner joina, to można wynieść warunek z WHERE do warunków złączenia. Czy trzeba i do którego, to już zależy od rozkładu danych i tego jak sprytny jest optymalizator danego silnika bazodanowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1